你只在输出上运行htmlspecialchars()还是你还有其他功能?

时间:2009-02-08 21:25:16

标签: php xss escaping htmlspecialchars

输出用户输入时,您是仅使用htmlspecialchars()还是还有运行的功能/操作/方法?我正在寻找能够处理XSS的东西。

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

3 个答案:

答案 0 :(得分:10)

我通常使用

htmlspecialchars($var, ENT_QUOTES) 
输入字段

。我创建了一个方法,因为我使用了很多,它使代码更短,更易读。

答案 1 :(得分:7)

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

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

这一般是计算的一个基本方面。因为分隔数据的语法可以在数据中出现,所以需要有一种方法来区分DATA和SYNTAX,从而逃避。

在网络编程中,常见的逃避案例是: 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(...)是合适的。不要忘记引号AROUND addslashes()调用:

    “INSERT INTO table1 SET field1 ='”。 addslashes($ data)。 “'”

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

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

答案 2 :(得分:-5)

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

您应该尽可能少地处理输出上的文本,以确保速度。处理它一次创造了很少的压力,然后处理它500,000次。