【发布时间】:2014-06-15 05:23:27
【问题描述】:
我有点困惑。当我在谷歌上打字的时候,几乎所有的文章都建议Filter input, escape output.如果我没有混淆一生的逃逸和过滤这两个词,应该是相反的。
你会得到很多类似
的文章$username = htmlentities(htmlspecialchars(strip_tags($_POST['username')));
并建议这样做。
我们不应该过滤输入。我们应该对它进行转义(之前我们使用 mysql_real_
escape_string 来实现,现在准备好的语句为我们处理它们。)我们应该将用户提交的数据插入数据库as-is,而不使用像htmlspecialchars这样的函数来更改它。我们应该始终将原始输入保留在我们的数据库中,因此输入期间的htmlspecialchars是错误的。 HTML 对数据库无害。我们应该过滤输出,这样恶意代码(html、js 等)就不会在浏览器上运行。这称为
XSS filtering,而不是XSS escaping。例如,Laravel 4 上的{{{ $var }}}被称为XSS filtering,这应该始终用于用户提交的内容的输出。
如果Filter input escape output 是正确的,为什么它不是mysql_real_filter_string() 并且防止XSS 不被称为XSS escaping?
另外,ircmaxell 曾经说过:
过滤不是为了防止安全漏洞,而是不要用垃圾填充数据库。如果您期待一个日期,请确保在存储之前它至少看起来像一个日期。
这称为validation,您不能只依赖验证。 (特别是在旧版本的 PHP 上)您需要转义和验证输入。过滤可能不能用于安全漏洞,但转义是。
嗯,这总结了我的困惑。谁能给我解释一下?
【问题讨论】: