【问题标题】:On which MVC layer should you filter output for XSS?您应该在哪个 MVC 层上过滤 XSS 的输出?
【发布时间】:2012-08-13 02:39:02
【问题描述】:

我正在用 PHP 编写一个调用几个 API 的 Web 应用程序。这些 API 中的内容不可信,我想在将其显示给用户之前对其进行过滤以进行 XSS。哪个 MVC 层适合执行 XSS 过滤器?

【问题讨论】:

    标签: model-view-controller web-applications xss


    【解决方案1】:

    表示层。准确地查看实例。在他们为模板赋值之前。

    XSS 是一种与响应格式相关的东西。例如,如果您的视图正在创建 JSON 响应,则它不会具有与 HTML 响应相同的潜在弱点。这又与检查完全不同,您在仅发送 HTTP 标头作为响应之前所做的检查。

    P.S.视图不是模板。

    【讨论】:

    • 当您说“在他们为模板分配值之前”时,您指的是什么。或许你能举例说明你的意思吗?
    • 视图是类/对象,在 MVC 和 MVC 启发的模式中包含控制响应和可视化的逻辑部分。 View 从模型层获取信息(在经典 MVC 和 Model2 MVC 视图中从模型层请求信息,在 MVVM 和 MVP 中,类控制器结构从模型层请求信息,然后传递给视图),然后基于该信息,视图决定使用哪些模板,或者是否需要模板,因为您只需要 HTTP 标头。
    • @Justin ,这是一种常见的误解,认为视图只是愚蠢的模板。它由专注于快速原型设计(如“生成一次性代码”)的框架推广。
    • 我知道 MVC 中的视图是什么。在 Web 应用程序中,它是您编写 HTML 的地方。我不明白你所说的模板是什么意思?我使用 CodeIgniter 作为我的 MVC 框架,你能指出一些视图何时“决定”模板的例子吗?决定使用什么“模板”来显示某些东西似乎是控制器的一项功能。
    • MVC 中的控制器负责改变模型层和视图的状态。视图决定使用哪些 多个 模板来创建响应。如果你不明白我所说的“模板”是什么意思,this article 可能会有所帮助。
    【解决方案2】:

    我想说答案有点复杂,而且还取决于偏好。过滤的第一步是输入验证。我们可以选择在将值分配给模型之前在控制器中进行输入验证,或者我们可以通过注释模型字段将验证规则放入模型本身,并让模型自行验证。

    现在输入验证是关于确保数据根据我们的域是有效的。对于用户名字段,我们可能不希望其中包含脚本标签。但是,在某些地方,脚本标签是完全有效的数据,甚至不会受到攻击。一个这样的例子就是这个站点,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 的地方进行,因为我们知道使用哪种编码是正确的。

    【讨论】:

    • 我同意。我面临的特殊问题是从 Twitter API 中提取信息。我不参与输入阶段,但我想他们正在努力过滤。尽管如此,在他们的文档中,他们告诉开发人员过滤来自 twitter API 的所有输出......所以我在我的 MVC 的视图层中这样做了。
    【解决方案3】:

    我在 Stack Overflow 上发现了一些类似的问题,answer by Quentin 似乎是回答这个问题的最佳方式。我将他的回答总结为:

    数据应在使用前进行清理。

    由于我从 API 获取不受信任的数据并将其显示在视图中,因此我在那里对其进行了 XSS 过滤。

    【讨论】:

      猜你喜欢
      • 2016-02-15
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多