我有一点困惑。当我在谷歌上打字时,几乎所有的文章都会提示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上)您需要转义并验证输入。过滤可能不会用于安全漏洞,但转移是。
嗯,这总结了我的困惑。有人可以向我解释一下吗?
答案 0 :(得分:4)
看起来我的困惑很简单。我认为输出图层是我们开始使用echo
时的图层,例如视图图层。
根据Anthony Ferrara的说法,输出是数据离开应用程序时的层,输入是数据进入应用程序时的层。
因此,Input
层不仅限于用户提供的内容,而是从配置文件读取,从文件系统读取,从第三方API等检索数据都被视为{{ 1}}。
Input
不限于视图图层上的Output
或echo
。 print
也计为SQL queries
,因为数据会离开我们的应用程序并进入数据库的范围。因此,写入文件也算作输出,执行shell命令也算作输出。
基本上,查询数据库是output
,而从数据库中检索结果是Output
。
当你这么想时,Input
听起来是正确的。如果有人像我一样困惑,这真的很有道理。
答案 1 :(得分:3)
首先关闭:htmlentities
或htmlspecialchars
实际上不会转义字符串,它们会将特定字符转换为html实体!
首先,您应该接受用户输入并删除伪/自动“安全”,如魔术引号。
if (get_magic_quotes_gpc())
{
$lastname = stripslashes($_POST['lastname']);
// ...
}
这样您就可以获得“纯粹”或原始用户输入。
然后过滤意味着不允许fooBar
之类的内容作为电子邮件地址!
if (!my_own_email_validity_check($_POST['email'])) die(); // maybe a bit extreme
然后转义要存储的用户输入(例如在您的数据库中)
$city = $mysqli->real_escape_string($city);
或者最好使用PDO,它“自动”地执行: - )
但真正重要的部分是在将数据从数据库显示给用户时,确保通过htmlspecialchars()
全部运行,因为您无法确定那里的任何东西都是健全的!!!
现在还有其他意见认为你应该在获得原始数据时立即运行htmlentities,但这使得使用它可怕,并且不是推荐的方式。 但它甚至可能取决于你在做什么,就像有很多事情一样。
总的来说,总结一下:
编辑:还存在很多命名差异,有时人们在转义某些内容时会将其称为过滤,或者在对某些内容进行消毒时将其称为一般转义等等。所以不要被命名困惑,只要明白发生了什么,你会没事的; - )
编辑2: 回答您的问题:
它被称为“过滤器输入,转义输出”,因为......
在我看来,问题是,命名不一致。
答案 2 :(得分:0)
过滤输入和转义输出,以防止存储不受信任,注入的错误数据,同时防止跨站点脚本(XSS)
答案 3 :(得分:0)
要查看短语最初使用的上下文,可能会有所帮助: http://shiflett.org/blog/2005/filter-input-escape-output http://shiflett.org/blog/2005/more-on-filtering-input-and-escaping-output
过滤输入并不意味着您没有通过转义来清理SQL插入。记住要谨慎,这只是一个引人入胜,简洁的最佳实践。克里斯·希弗莱特(Chris Shiflett)并未表示您永远不会逃避输入或过滤输出。