5

可能重复:
在数据库插入之前输入 PHP htmlentities(),而不是输出

对于一个只是试图保护自己免受 XSS 攻击的 PHP 应用程序,应该在什么阶段htmlentities()调用该函数?它应该在初始用户输入时调用,还是在输出数据的每个页面渲染时调用?

如果我htmlentities()在用户输入上使用,我最终会在数据库中存储更多的数据。但是,从长远来看,我节省了 CPU 周期,因为我只需要在输入上执行转换,而不必再在该数据的后续输出上执行。

我应该注意,我看不到任何必须在我的应用程序中存储 HTML 输入数据的可预见情况,因此使用htmlentities()纯粹是为了 XSS 保护。万一我确实需要原始 HTML,我可以简单地调用html_entity_decode()reverse htmlentities()。此外,它使我免于忘记调用htmlentities()页面渲染并意外地将 XSS 漏洞插入到我的应用程序中。

我玩弄了使用 Facebook 的 XHP 扩展的想法,但是 XML 解析会产生相当多的开销,这超出了我对我的应用程序的习惯。


摘要:我应该htmlentities()在输入上使用还是在输出上使用?对于这种情况,普遍接受的方法是什么?

4

3 回答 3

3

除非您可以保证在应用程序的整个生命周期内,输入只会被提供给 Web 浏览器,否则这个问题不值得讨论:您应该在输出上使用 XSS 保护,否则您最终将不得不在根据具体情况输出(无论可能是何种输出)。这正是您当前对输入应用保护的论点。

鉴于即使现在(更不用说在未指定的未来时间)上述情况也不太可能是真的,恕我直言,答案是显而易见的。

于 2012-06-30T17:11:18.050 回答
2

我更喜欢在输出中使用它,这样可以保持对非 html 版本的输出使用相同数据的可能性。

于 2012-06-30T17:03:32.567 回答
0

没有理由在输入时这样做。

如果您想要高性能,只需创建 2 个字段:text、escaped_text 并在第一个输出上填充第二个字段并在更新时将其重置。

如果您将使用模板引擎,它将为您转义所有数据。

于 2012-06-30T18:11:29.357 回答