防止 PHP 中 uri 参数中的 XSS

Prevent XSS in uri parameters in PHP

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

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

我需要采取什么步骤来防止它。我似乎无法为此找到好的答案,即使在 OWASP 网站上也是如此。根据 OWASP,每个 ascii 值小于 256 的字符都可以。

我也不想要一些非常通用的解决方案,例如通过条带化每个参数的 <> 符号来清理每个参数。

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

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

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

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

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

http://example.com?search=<script>alert(1);</script>

将导致以下结果 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/etc。我确定有人可以在 PHP.

中为您指出执行此操作的函数或库

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

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

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

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

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

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

According to OWASP every character with ascii value of less than 256 is ok.

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

I also don't want some very generic solution such as sanitizing each param by striping it's <> signs

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

是否需要接受并反映(显示)任意HTML代码?

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

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