输出用户输入时,您是仅使用htmlspecialchars()
还是还有运行的功能/操作/方法?我正在寻找能够处理XSS的东西。
我想知道我是否应该编写一个在输出时转义用户输入的函数,或者只是使用htmlspecialchars()
。我正在寻找通用案例,而不是可以单独处理的具体案例。
答案 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的背景下回顾一下:
将文字转换为HTML: 用htmlspecialchars(...)
数据到HTML属性 htmlspecialchars(...,ENT_QUOTES)
HTML转换为HTML 使用HTMLPurifier等库来确保只存在有效标记。
将数据导入Javascript
我更喜欢json_encode
。如果要将其放在属性中,则仍需要使用#2,例如
将数据插入SQL 每个驱动程序都有某种类型的escape()函数。这是最好的。如果您使用普通的latin1字符集运行,则addslashes(...)是合适的。不要忘记引号AROUND addslashes()调用:
“INSERT INTO table1 SET field1 ='”。 addslashes($ data)。 “'”
命令行上的数据 escapeshellarg()和escapeshellcmd() - 阅读手册
- 牢记这些,您将消除95%*的常见网络安全风险! (*猜测)
答案 2 :(得分:-5)
你不应该在输出上清理文本,它应该在输入时发生。我使用过滤器过滤应用程序的所有输入。它是可配置的,因此它可以在需要时允许特定的标签/数据(例如,对于wysiwig编辑器)。
您应该尽可能少地处理输出上的文本,以确保速度。处理它一次创造了很少的压力,然后处理它500,000次。