5

输出用户输入时,您是否只使用htmlspecialchars()或是否有您还运行的功能/动作/方法?我正在寻找也可以处理 XSS 的东西。

我想知道我是否应该编写一个在输出上转义用户输入的函数,或者只使用htmlspecialchars(). 我正在寻找一般案例,而不是可以单独处理的特定案例。

4

3 回答 3

10

我通常使用

htmlspecialchars($var, ENT_QUOTES) 

在输入字段上。我创建了一个这样做的方法,因为我经常使用它,它使代码更短且更具可读性。

于 2009-02-08T21:27:19.520 回答
7

让我们快速回顾一下为什么在不同的情况下需要转义:

如果您在引号分隔的字符串中,则需要能够转义引号。如果在xml中,则需要将“内容”与“标记”分开如果在SQL中,则需要将“命令”与“数据”分开如果在命令行上,则需要将“命令”分开来自“数据”

这是一般计算的一个非常基本的方面。因为分隔数据的语法可能出现在数据中,所以需要有一种方法来区分数据和语法,因此需要转义。

在网络编程中,常见的转义情况有: 1. 将文本输出到 HTML 2. 将数据输出到 HTML 属性 3. 将 HTML 输出到 HTML 4. 将数据插入到 Javascript 5. 将数据插入到 SQL 6. 将数据插入到 shell 命令中

如果处理不当,每一个都有不同的安全隐患。这真的很重要!让我们在 PHP 的上下文中回顾一下:

  1. 将文本转换为 HTML:htmlspecialchars(...)

  2. 数据转化为 HTML 属性 htmlspecialchars(..., ENT_QUOTES)

  3. HTML 到 HTML 使用诸如HTMLPurifier之类的库来确保只存在有效的标签。

  4. 我更喜欢将数据转换为 Javascript json_encode。如果是放在一个属性中,还是需要使用#2,比如

  5. 将数据插入 SQL 每个驱动程序都有某种形式的 escape() 函数。这是最好的。如果你在一个普通的 latin1 字符集中运行,addslashes(...) 是合适的。不要忘记 addlashes() 调用周围的引号:

    "INSERT INTO table1 SET field1 = '" 。添加斜杠($data)。"'"

  6. 命令行 escapeshellarg() 和 escapeshellcmd() 上的数据——阅读手册

-- 牢记这些,您将消除 95%* 的常见网络安全风险!(* 一个猜想)

于 2009-02-09T04:03:49.020 回答
-5

您不应该在输出时清理文本,它应该在输入时发生。我使用过滤器过滤应用程序的所有输入。它是可配置的,因此它可以在需要时允许特定的标签/数据通过(例如,对于所见即所得的编辑器)。

您应该尽可能少地处理输出文本,以确保速度。处理一次会产生更少的压力,然后处理 500,0000 次。

于 2009-02-09T21:33:55.237 回答