【问题标题】:Prevent XSS in uri parameters in PHP在 PHP 中的 uri 参数中防止 XSS
【发布时间】:2015-08-03 15:29:10
【问题描述】:

在我的应用程序中,攻击者可以像这样传入 URI:

http://domain/someapi?entryId=d2rf<script>alert("gotcha")</script>f334&param2=....

我需要采取哪些步骤来防止它发生。即使在 OWASP 站点中,我似乎也找不到一个好的答案。根据 OWASP,每个 ascii 值小于 256 的字符都可以。

我也不想要一些非常通用的解决方案,例如通过删除每个参数的 标志来清理每个参数。

【问题讨论】:

  • 这是一个有效的攻击示例吗?您是否像这样盲目地执行 ID 中的任何 javascript?他们不需要用<script> 标签包围它吗?我真的无法想象你必须以这种方式做事的情况,而且几乎应该普遍避免。
  • 该死,堆栈溢出剥离了它。有脚本标签。
  • 哦,呵呵。我应该检查一下来源。我为你编辑了它。
  • ASCII 实际上只有字节值在 0-127 之间的字符。
  • “根据 OWASP,ascii 值小于 256 的每个字符都可以”——你误解了 OWASP 的意思。

标签: php security xss


【解决方案1】:

好的,让我们举个例子。您有一个搜索页面,它为搜索查询采用 GET 参数。

http://example.com?search=test+search

在您的搜索页面上,您执行了类似的操作。

<p>your search results for "{search}":</p>

这很容易受到reflected XSS 的攻击。以下查询:

http://example.com?search=&lt;script&gt;alert(1);&lt;/script&gt;

将产生以下 HTML:

<p>your search results for "<script>alert(1);</script>":</p>

显然,这并不好,因为它会执行脚本(好吧,XSS Auditor可能阻止它,但我们不依赖它)。我们可以做的第一件事来帮助防止 XSS 是转义这个字符串,因为它是不受信任的并且来自客户端。

<p>your search results for "{HTML.Escape(search)}":</p>

当然,此语法取决于您的服务器端语言。一般来说,您正在寻找 HTMLEncode/Escape/等。我相信有人可以为您指出一个在 PHP 中执行此操作的函数或库。

现在我们对字符串进行了转义,我们的输出将如下所示:

<p>your search results for "&lt;script&gt;alert(1)&lt;/script&gt;":</p>

这将在浏览器中显示为 &amp;lt;,但源代码将被编码 (&amp;lt;)。

这是防止大多数 XSS 的一般概述。手动转义每个输入可能有点冒险,因为您可能会忘记一个。所以你想使用某种模板系统。您可以为 HTML 属性/javascript 字符串/html 实体等执行不同的操作。

Google 对此有很好的介绍性资源:

https://www.google.com/about/appsecurity/learning/xss/#PreventingXSS

【讨论】:

    【解决方案2】:

    根据 OWASP,ascii 值小于 256 的每个字符都可以。

    什么?没有。XSS prevention depends on context!我也很确定 OWASP 不会认为每个小于 256 的 ASCII 值都可以,因为 ASCII 仅针对字符 0 - 127 定义。

    我也不想要一些非常通用的解决方案,例如通过删除每个参数的 标志来清理每个参数

    如果攻击者在 URL 参数中提供恶意 Javascript 代码,您无法阻止他们这样做。您可以做的是确保您的应用程序不会盲目地将此值回显给用户,否则您已经打开了反射性跨站点脚本漏洞的大门。

    您需要接受和反映(显示)任意 HTML 代码吗?

    • :使用HTML Purifier
    • :以下其中一项应该可以安全使用:
      • htmlentities($yourStringVariable, ENT_QUOTES | ENT_HTML5, 'UTF-8');
      • 仅适用于 URL:http_build_query($yourArrayOfKeysAndValues);urlencode($string);

    演示:http://3v4l.org/itUZX

    【讨论】:

    • 根据你所说的和@Gray 提到的听起来你会在渲染html之前进行检查。对我来说这听起来很奇怪。当控制器收到请求时,为什么不这样做呢?此外,如果您的服务器使用字符串作为 id 并且视图会以不同的方式呈现它,因为它从其中剥离了一些字符,那么用户将获得错误的 id。
    • "对我来说这听起来很奇怪。为什么不在控制器收到请求时这样做呢?"这是过早优化的一种形式。如果您要将信息存储在数据库中,请将其逐字存储(不转义),以便它可以作为唯一、不变的事实来源,然后在呈现页面时对其进行转义。 (使用准备好的语句。)
    • 以类似的方式,如果您要在控制器中转义它,您将剥夺自己将其逐字存储在数据库中的能力。你失去了唯一的事实来源,因为它在输入之前就被改变了。
    • 但如果“真相”包含脚本标签,我想我不会想要它——我宁愿拥有更安全、更干净的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2014-09-12
    • 2014-11-14
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 2012-10-28
    相关资源
    最近更新 更多