我有一个小的困惑。当我在Google上输入内容时,几乎所有的文章都建议“过滤输入,转义输出”。如果我没有一直混淆转义和过滤这两个术语,那么它应该是相反的。
你会看到很多文章类似于:
$username = htmlentities(htmlspecialchars(strip_tags($_POST['username')));
建议不要过滤输入,而是进行转义(之前我们使用mysql_real_escape
_string来进行转义,现在预先准备的语句为我们处理)。我们应该将用户提交的数据原封不动地插入到数据库中,不要使用htmlspecialchars
等函数对其进行更改。我们应该始终保留数据库中的原始输入,因此在输入时使用htmlspecialchars
是错误的。HTML对数据库来说不会造成伤害。
我们应该过滤输出,以防恶意代码(如html、js等)在浏览器上运行。这被称为XSS过滤
,而不是XSS转义
。例如,在Laravel 4上,{{{ $var }}}
被称为XSS过滤
,在用户提交的内容输出时应始终使用它。
如果“过滤输入转义输出”表述正确,为什么不使用mysql_real_filter_string()
并将XSS防护称为XSS转义
?
此外,ircmaxell
曾经说过:
过滤并不是为了防止安全漏洞,而是为了不让垃圾填满你的数据库。如果你期望得到一个日期,请确保它看起来至少像是一个日期,然后再将其存储。
这被称为验证
,但你不能仅依赖于验证。(特别是在旧版本的PHP上)你需要同时对输入进行转义和验证。过滤可能不用于安全漏洞,但转义是必须的。
好了,这就解决了我的困惑。有人能向我解释一下吗?