德雷克上面的答案让我感到困扰,所以我创建了一个简单的概念证明来检查我是否正确。我是正确的。即使使用Content-Type: text/plain;charset=UTF-8
,应用程序也可以被简单的XSS攻击破坏。
原因就像我第一次尝试解释的那样,重要的是数据处理,以及数据的最终目的地和渲染上下文。传输并不是那么重要。我创建了一个简单的servlet,返回与OP相同的响应,包括Content-Type
头。以下是该响应:
HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Cache-Control: no-cache
Content-Type: text/plain
Content-Length: 73
Date: Thu, 18 Jun 2015 22:49:01 GMT
Connection: close
Invalid project area item id <iframe src=javascript:alert(1)></iframe>
这里是结果的图片。注意,攻击载荷已被执行:https://flic.kr/p/uRnSgo
再次强调,原因非常简单。数据不是在 AJAX 请求中呈现,而是在消费者 Web 应用程序页面中呈现,该页面是一个 HTML 页面。
无论如何,我希望这能消除任何关于在某些情况下容易受到攻击的疑虑......尤其是当响应针对将在消费页面中呈现的 AJAX 请求时。
----- 下面是我的原始回复。 -----
带有错误消息的 400 响应让我想起了 REST API 响应。
如果这是一个 REST 请求(请求头中包含 X-Requested-With: XMLHttpRequest
或 Accept: application/json
),那么你会面临一个严重问题。尽管此响应未受到影响,但最终用户的 UI 可能会拾取并显示数据。由于没有正确编码,它将被执行。您不仅要担心此响应,还要考虑攻击载荷的最终处理方式。假设这是 XMLHttpRequest 或 REST 调用的响应,则这是个严重的漏洞。
您可以使用攻击载荷 <iframe src=javascript:alert(1)></iframe>
进行测试,我敢打赌您会在消费应用程序中看到它。
我建议:使用无效的项目区域项 ID
,并省略无效值。这是最便宜的解决方案。
因此,在一般情况下,您不能仅仅依靠Content-Type
来保护自己。数据可能会在另一个上下文中呈现,并且将被执行。
始终验证输入并正确处理输出,其中可能包括根据将呈现该输出的上下文对其进行编码。任何告诉您否则的人都试图摆脱某些必要工作。:-)