依靠Content-Type:text/plain来缓解响应中的恶意javascript执行是否安全?

依靠Content-Type:text/plain来缓解响应中的恶意javascript执行是否安全?,javascript,xss,content-type,Javascript,Xss,Content Type,我们有一个返回的web应用程序 HTTP/1.1400错误请求 ... 内容类型:文本/纯文本;字符集=UTF-8 内容长度:57 日期:2015年4月14日星期二19:24:54 GMT 连接:关闭 无效的项目区域项id 警报(1086) 我的理解是,依赖于内容类型:文本/纯文本;charset=UTF-8作为阻止javascript执行的防御是不够的。相反,应该对输出进行编码,并且输入很可能经过输入验证并抛出垃圾 我要寻找的是一些关于正确处理包含javascript的响应(其中内容类型

我们有一个返回的web应用程序


HTTP/1.1400错误请求
...
内容类型:文本/纯文本;字符集=UTF-8
内容长度:57
日期:2015年4月14日星期二19:24:54 GMT
连接:关闭
无效的项目区域项id
警报(1086)

我的理解是,依赖于内容类型:文本/纯文本;charset=UTF-8作为阻止javascript执行的防御是不够的。相反,应该对输出进行编码,并且输入很可能经过输入验证并抛出垃圾

我要寻找的是一些关于正确处理包含javascript的响应(其中内容类型已设置为text/plain)的方法的明确而正式的答案


有人有这个场景的官方例子的链接(或答案)和正确的处理方法吗?或者是内容类型:文本/普通;charset=UTF-8所需的一切?

上面的答案让我感到困惑,所以我创建了一个简单的概念证明,看看我是否正确。我是。即使使用
内容类型:文本/普通;charset=UTF-8
一个简单的XSS攻击就可以破坏应用程序

正如我第一次尝试在下面解释的那样,原因是数据处理非常重要,数据的最终目的地和呈现上下文也很重要。交通不那么重要。我创建了一个简单的servlet,它返回与OP类似的响应,包括
内容类型
标题。以下是答案:

HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Cache-Control: no-cache
Content-Type: text/plain;charset=UTF-8
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> 
HTTP/1.1400错误请求
服务器:ApacheCoote/1.1
缓存控制:没有缓存
内容类型:文本/纯文本;字符集=UTF-8
内容长度:73
日期:2015年6月18日星期四格林威治标准时间22:49:01
连接:关闭
无效的项目区域项id
这是结果的图像。请注意,攻击有效负载是在以下情况下执行的:

同样,原因很简单。数据不是在AJAX请求中呈现的,而是在消费web应用程序页面中呈现的,是一个HTML页面

无论如何,我希望这能消除人们对在某些情况下易受伤害的疑虑。。。特别是当响应将在消费页面中呈现的AJAX请求时

-----以下是我最初的回答-----

带有错误消息的400响应闻起来像是对我的RESTAPI响应

如果这是一个REST请求(
X-request-With:XMLHttpRequest
Accept:application/json
),那么您将面临一个严重的问题。虽然此响应不受影响,但数据可能会被消费页面拾取并显示在最终用户的UI中。由于未正确编码,它将执行。您不必总是担心这种响应,而是担心攻击负载的最终配置。假设这是对XMLHttpRequest或REST调用的响应,这是一个严重的错误

您可以使用
的攻击负载进行测试,我敢打赌您会在消费应用程序中看到该pop

我建议:
无效的项目区域项目id
忽略无效值。最便宜的解决方案

因此,不,您通常不能依靠
内容类型来保存您的信息。数据可能会显示在另一个上下文中,在该上下文中它将执行


始终验证输入并正确处理输出,输出可能包括某种格式或其他格式的编码,具体取决于呈现的上下文。任何告诉你不这样做的人都是在试图逃避一些必要的工作。:-)

这里有两种情况

顶级XSS 如果攻击者可以操纵顶级URL响应格式错误的请求,如

HTTP/1.1 400 Bad Request
...
<script>alert(document.cookie)</script>

更多阅读(PDF)


“text/plain”不应处理指令类型,仅被视为一个线性字符序列。

是什么消耗了此错误消息?输出什么或如何输出并不重要,这完全取决于它在另一端的使用方式。如果将任何web响应通过管道传输到web上下文中,那么它当然会在web上下文中解析。这是Web101。如果您直接伪造一个无效的请求并在结果中获得JS,并且上下文是text/plain,那么我的答案是正确的;字符集=UTF-8所需的全部信息?回答:不,这不是所需要的全部。您需要说明数据将在何处使用,并进行适当的编码。德雷克斯,你上面的新答案改进了,谢谢。最初的答案说没什么可担心的,这是误导。Safari似乎不再嗅探文本/纯文本上的HTML
HTTP/1.1 400 Bad Request
...
<script>alert(document.cookie)</script>
<?php
header("Content-Type: text/plain");
echo "<script>alert(1)</script>";