我正在用 PHP 编写一个调用几个 API 的 Web 应用程序。这些 API 中的内容不可信,我想在将其显示给用户之前对其进行过滤以进行 XSS。哪个 MVC 层适合执行 XSS 过滤器?
3 回答
表示层。准确地查看实例。在他们为模板赋值之前。
XSS 是一种与响应格式相关的东西。例如,如果您的视图正在创建 JSON 响应,则它不会具有与 HTML 响应相同的潜在弱点。这又与检查完全不同,您在仅发送 HTTP 标头作为响应之前所做的检查。
PS视图不是模板。
我想说答案有点复杂,也取决于偏好。过滤的第一步是输入验证。我们可以选择在将值分配给模型之前在控制器中进行输入验证,或者我们可以通过注释模型字段将验证规则放入模型本身,并让模型自行验证。
现在输入验证是关于确保数据根据我们的域是有效的。对于用户名字段,我们可能不希望其中包含脚本标签。但是,在某些地方,脚本标签是完全有效的数据,甚至不会受到攻击。一个这样的例子就是这个站点,stackoverflow。对于评论或问题字段,我们需要允许 script 标签,因为它们作为用户数据是有效的。但是,我们需要确保脚本不会被解释为代码,而是保留数据。这将我们带到答案的第二部分——编码。
当我们编码时,我们需要根据上下文进行编码。如果我们在这样的 javascript 变量中输出:
<script> var a = 'INPUT_HERE'</script>
我们需要使用与在 HTML 标记之间输出不同的编码:
<h1>INPUT_HERE</h1>
或在 html 属性内或使用 CSS ....
我强烈推荐 OWASP Abridged XSS Prevention Cheat sheet:https ://www.owasp.org/index.php/Abridged_XSS_Prevention_Cheat_Sheet
这意味着我们需要根据输出数据的位置来改变计算,我们可以在同一个视图甚至同一个模板中的不同位置输出相同的数据。
所以编码需要在我们将数据放入 HTML 的地方进行,因为我们知道使用哪种编码是正确的。
我在 Stack Overflow 上发现了一些类似的问题,Quentin 的回答似乎是回答这个问题的最佳方式。我将他的回答总结为:
数据应在使用前进行清理。
由于我从 API 获取不受信任的数据并将其显示在视图中,因此我在此处为 XSS 过滤它。