我有点困惑。当我在Google上输入文字时,几乎所有文章都建议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
。例如,{{{ $var }}}
在Laravel 4上称为as,XSS filtering
并且应始终将其用于用户提交的内容的输出。
如果该语句Filter input escape output
是正确的,为什么不正确,mysql_real_filter_string()
并且防止XSS不被称为XSS escaping
?
另外,ircmaxell
曾经说过:
过滤不是要防止安全漏洞,而是要不要用垃圾填充数据库。如果您希望有一个日期,请确保它至少看起来像是存储日期之前的日期。
这称为validation
,您不能仅依靠验证。(特别是在旧版本的PHP上)您需要转义和验证输入。筛选可能不会用于安全漏洞,但会转义。
好吧,这使我感到困惑。谁可以给我解释一下这个?
看起来我的困惑很简单。我以为输出层是我们开始使用时的层echo
,例如视图层。
根据Anthony Ferrara的说法,输出是数据离开应用程序时的层,输入是数据进入应用程序时的层。
因此,Input
层不仅限于用户提供的内容,而且从配置文件读取,从文件系统读取,从第三方API检索数据等都被视为Input
。
Output
不限于视图层echo
或print
在视图层上。SQL queries
也算作output
,因为数据离开我们的应用程序并进入数据库的范围。这样,写入文件也算作输出,执行shell命令也算作输出。
因此,基本上,查询数据库为Output
,而从数据库中检索结果为Input
。
当您这样想时,Filter input, escape output
听起来是正确的。如果其他人像我一样困惑,那确实是有道理的。