2009-02-08 30 views

回答

10

我通常在输入字段使用

htmlspecialchars($var, ENT_QUOTES) 

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

+1

为什么使用`ENT_QUOTES`(而不是我所建议的`ENT_NOQUOTES`)? – 2009-02-08 21:30:05

+2

我使用ENT_QUOTES输入来自数据库的数据。因此,如果数据中有'或',它将不会关闭输入标签中的值变量。 – 2009-02-08 21:33:43

7

让有为什么需要在不同的上下文中逃逸的快速回顾:

如果你是在一个引号分隔字符串,你需要能够逃脱引号。 如果你是在XML中,则需要从“标记” 如果你在SQL,你需要的,如果你是在命令行中,从“数据”分离“命令” 单独的“内容”,你需要单独从“数据”

“命令”这是计算的一般一个非常基本的方面。因为划分数据的语法可能发生在数据中,所以需要有一种方法来区分DATA和SYNTAX,从而转义。

在网页编程,共同逃逸案件是:1。 输出文本到HTML 2.输出数据到HTML属性 3.输出HTML的成HTML 4.将数据插入到JavaScript 5.将数据插入SQL 6.将数据插入到外壳命令

如果处理不当每一个都有不同的安全隐患。这非常重要!让我们回顾一下这个在PHP的背景:

  1. 文成HTML:用htmlspecialchars (...)

  2. 数据转换成HTML属性 用htmlspecialchars(...,ENT_QUOTES)

  3. HTML转换为HTML 使用诸如HTMLPurifier之类的库来确保只存在有效标签。数据转换成Javascript 我更喜欢json_encode。如果你把它放在一个属性,你仍然需要使用#2,如

  4. 将数据插入SQL 每个驱动程序都有某种形式的escape()函数。这是最好的。如果您正在使用正常的latin1字符集,则addslashes(...)是合适的。不要忘了周围的和addslashes引号()调用:

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

  5. 数据在命令行 escapeshellarg()和escapeshellcmd()将 - 阅读手册

- 把这些对心脏,你会消除常见的95%*网络安全风险! (*猜一猜)

-5

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

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

相关问题