当输出用户输入,你只能使用htmlspecialchars()
或者是有功能/操作/方法还跑?我正在寻找一些能够解决XSS的问题。你只在输出上运行htmlspecialchars()吗?还有其他功能吗?
我想知道如果我应该写逃逸输出用户输入的功能或只是使用htmlspecialchars()
。我正在寻找通用案例,而不是可以单独处理的具体案例。
当输出用户输入,你只能使用htmlspecialchars()
或者是有功能/操作/方法还跑?我正在寻找一些能够解决XSS的问题。你只在输出上运行htmlspecialchars()吗?还有其他功能吗?
我想知道如果我应该写逃逸输出用户输入的功能或只是使用htmlspecialchars()
。我正在寻找通用案例,而不是可以单独处理的具体案例。
我通常在输入字段使用
htmlspecialchars($var, ENT_QUOTES)
。我创建了一个这样做的方法,因为我使用了很多,它使代码更短,更易读。
让有为什么需要在不同的上下文中逃逸的快速回顾:
如果你是在一个引号分隔字符串,你需要能够逃脱引号。 如果你是在XML中,则需要从“标记” 如果你在SQL,你需要的,如果你是在命令行中,从“数据”分离“命令” 单独的“内容”,你需要单独从“数据”
“命令”这是计算的一般一个非常基本的方面。因为划分数据的语法可能发生在数据中,所以需要有一种方法来区分DATA和SYNTAX,从而转义。
在网页编程,共同逃逸案件是:1。 输出文本到HTML 2.输出数据到HTML属性 3.输出HTML的成HTML 4.将数据插入到JavaScript 5.将数据插入SQL 6.将数据插入到外壳命令
如果处理不当每一个都有不同的安全隐患。这非常重要!让我们回顾一下这个在PHP的背景:
文成HTML:用htmlspecialchars (...)
数据转换成HTML属性 用htmlspecialchars(...,ENT_QUOTES)
HTML转换为HTML 使用诸如HTMLPurifier之类的库来确保只存在有效标签。数据转换成Javascript 我更喜欢json_encode
。如果你把它放在一个属性,你仍然需要使用#2,如
将数据插入SQL 每个驱动程序都有某种形式的escape()函数。这是最好的。如果您正在使用正常的latin1字符集,则addslashes(...)是合适的。不要忘了周围的和addslashes引号()调用:
“INSERT INTO table1的SET field1的=“”。 addslashes($ data)。“'”
数据在命令行 escapeshellarg()和escapeshellcmd()将 - 阅读手册
- 把这些对心脏,你会消除常见的95%*网络安全风险! (*猜一猜)
你不应该在输出上清理文本,它应该发生在输入上。我使用过滤器来过滤应用程序的所有输入。它是可配置的,以便它可以在需要时允许特定的标签/数据通过(例如对于wysiwig编辑器)。
您应尽可能少地处理输出文本,以确保速度。处理它一次会产生更少的应变,然后处理它500,000次。
为什么使用`ENT_QUOTES`(而不是我所建议的`ENT_NOQUOTES`)? – 2009-02-08 21:30:05
我使用ENT_QUOTES输入来自数据库的数据。因此,如果数据中有'或',它将不会关闭输入标签中的值变量。 – 2009-02-08 21:33:43