在我的应用程序中,攻击者可以传递这样的URI:
http://domain/someapi?entryId=d2rf<script>alert("gotcha")</script>f334¶m2=....
我需要采取哪些措施来防止它。即使在OWASP网站上,我似乎无法找到一个好的答案。根据OWASP,ascii值小于256的每个字符都可以。
我也不想要一些非常通用的解决方案,例如通过剥离它的&lt;&gt;来清理每个参数。迹象。
答案 0 :(得分:1)
好的,我们来看一个例子吧。您有一个搜索页面,它为搜索查询提供了一个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 可能会阻止它,但我们不依赖于它。我们可以做的第一件事就是逃避这个字符串,因为它不受信任并来自客户端。
<p>your search results for "{HTML.Escape(search)}":</p>
当然,这种语法取决于您的服务器端语言。一般来说,您正在寻找HTMLEncode / Escape /等。我确信有人可以指向一个函数或库,以便在PHP中执行此操作。
现在我们转义字符串,我们的输出看起来像这样:
<p>your search results for "<script>alert(1)</script>":</p>
这将在浏览器中显示为<
,但源代码将被编码(<
)。
这是预防大多数XSS的一般概述。手动逃避每一个输入可能有点冒险,因为你可能会忘记一个。所以你想使用某种模板系统。您为HTML属性/ javascript字符串/ html实体等做了不同的事情。
Google为此提供了很好的介绍性资源:
https://www.google.com/about/appsecurity/learning/xss/#PreventingXSS
答案 1 :(得分:1)
根据OWASP,ascii值小于256的每个字符都可以。
什么?不,XSS prevention depends on context!我也非常确定OWASP不会将每个小于256的ASCII值视为可以,因为ASCII仅定义为0到127个字符。
我也不想要一些非常通用的解决方案,例如通过剥离它来清理每个参数&lt;&gt;&lt;&gt;标志
如果攻击者在URL参数中提供恶意Javascript代码,则无法阻止他们这样做。您可以做的是确保您的应用程序不会盲目地将此值反映给用户,否则您已经打开了通向反思的跨站点脚本漏洞的大门。 / p>
您是否需要接受并反映(显示)任意HTML代码?
htmlentities($yourStringVariable, ENT_QUOTES | ENT_HTML5, 'UTF-8');
http_build_query($yourArrayOfKeysAndValues);
或urlencode($string);