输出用户输入时,您是否只使用htmlspecialchars()
或是否有您还运行的功能/动作/方法?我正在寻找也可以处理 XSS 的东西。
我想知道我是否应该编写一个在输出上转义用户输入的函数,或者只使用htmlspecialchars()
. 我正在寻找一般案例,而不是可以单独处理的特定案例。
输出用户输入时,您是否只使用htmlspecialchars()
或是否有您还运行的功能/动作/方法?我正在寻找也可以处理 XSS 的东西。
我想知道我是否应该编写一个在输出上转义用户输入的函数,或者只使用htmlspecialchars()
. 我正在寻找一般案例,而不是可以单独处理的特定案例。
我通常使用
htmlspecialchars($var, ENT_QUOTES)
在输入字段上。我创建了一个这样做的方法,因为我经常使用它,它使代码更短且更具可读性。
让我们快速回顾一下为什么在不同的情况下需要转义:
如果您在引号分隔的字符串中,则需要能够转义引号。如果在xml中,则需要将“内容”与“标记”分开如果在SQL中,则需要将“命令”与“数据”分开如果在命令行上,则需要将“命令”分开来自“数据”
这是一般计算的一个非常基本的方面。因为分隔数据的语法可能出现在数据中,所以需要有一种方法来区分数据和语法,因此需要转义。
在网络编程中,常见的转义情况有: 1. 将文本输出到 HTML 2. 将数据输出到 HTML 属性 3. 将 HTML 输出到 HTML 4. 将数据插入到 Javascript 5. 将数据插入到 SQL 6. 将数据插入到 shell 命令中
如果处理不当,每一个都有不同的安全隐患。这真的很重要!让我们在 PHP 的上下文中回顾一下:
将文本转换为 HTML:htmlspecialchars(...)
数据转化为 HTML 属性 htmlspecialchars(..., ENT_QUOTES)
HTML 到 HTML 使用诸如HTMLPurifier之类的库来确保只存在有效的标签。
我更喜欢将数据转换为 Javascript json_encode
。如果是放在一个属性中,还是需要使用#2,比如
将数据插入 SQL 每个驱动程序都有某种形式的 escape() 函数。这是最好的。如果你在一个普通的 latin1 字符集中运行,addslashes(...) 是合适的。不要忘记 addlashes() 调用周围的引号:
"INSERT INTO table1 SET field1 = '" 。添加斜杠($data)。"'"
命令行 escapeshellarg() 和 escapeshellcmd() 上的数据——阅读手册
-- 牢记这些,您将消除 95%* 的常见网络安全风险!(* 一个猜想)
您不应该在输出时清理文本,它应该在输入时发生。我使用过滤器过滤应用程序的所有输入。它是可配置的,因此它可以在需要时允许特定的标签/数据通过(例如,对于所见即所得的编辑器)。
您应该尽可能少地处理输出文本,以确保速度。处理一次会产生更少的压力,然后处理 500,0000 次。