防止 PHP 中 uri 参数中的 XSS
Prevent XSS in uri parameters in PHP
在我的应用程序中,攻击者可以像这样传入 URI:
http://domain/someapi?entryId=d2rf<script>alert("gotcha")</script>f334¶m2=....
我需要采取什么步骤来防止它。我似乎无法为此找到好的答案,即使在 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 "<script>alert(1)</script>":</p>
这将在浏览器中显示为 <
,但源代码将被编码 (<
)。
这是防止大多数 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);
在我的应用程序中,攻击者可以像这样传入 URI:
http://domain/someapi?entryId=d2rf<script>alert("gotcha")</script>f334¶m2=....
我需要采取什么步骤来防止它。我似乎无法为此找到好的答案,即使在 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 "<script>alert(1)</script>":</p>
这将在浏览器中显示为 <
,但源代码将被编码 (<
)。
这是防止大多数 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);