为什么内联JS块不安全?

8
我正在阅读Chrome扩展文档"内容安全策略(CSP)"。它说:

内联JavaScript以及危险的字符串转换JavaScript方法,如eval,将不会被执行。此限制禁止内联块和内联事件处理程序(例如<button onclick="...">)。

...

没有放松执行内联JavaScript限制的机制。特别是,设置包含unsafe-inline的脚本策略将没有任何效果。这是有意为之的。

为什么内联<script>块是不安全的?有人能解释一下吗?如果您能提供示例,那就更好了。
谢谢。
1个回答

9

正如页面所述:

第一个限制通过使您无法意外执行由恶意第三方提供的脚本来消除了大量的跨站点脚本攻击。

基本上,您加载的任何脚本都需要在扩展程序可以本地访问的单独文件中。这可以防止您加载被注入到您的页面中的第三方脚本或像以下方式包含它们:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

一个例子是,如果你有一个用户可以填写的表单。用户可以输入一些JS代码的脚本标签。比如说像一个讨论论坛。我进去发一个帖子,但它里面有一些隐藏的JS。假设在发布之前你没有清理掉它。现在我的帖子里有JS会在每个人查看它的时候执行。这会防止该脚本被执行。


2
我正在尝试理解这些内联的<script>块如何被恶意第三方攻击。有例子吗? - weilou
1
在我的情况下,我会在呈现之前将表单或URL中输入的任何文本转换为安全形式。根据这个答案,我的网站是安全的。那么为什么浏览器还要保护我,当我已经很安全了呢?为什么我不能告诉CSP我的内联脚本是可以的,并让浏览器遵守它呢? - David Spector
@DavidSpector,如果您控制页面的内容或标头,则可以告诉浏览器以多种方式执行内联脚本。您需要在页面上设置标头或包含等效的元素。标头必须命名为content-security-policy,并将允许执行内联脚本的策略之一分配给script-src:'unsafe-inline'、'sha256-...'或'nonce-...' - 更多信息请参见此处:https://content-security-policy.com/。 - user625488
1
@user625488 我认为你是在回答“如何标记内联脚本为可执行”的问题,而不是我所问的“为什么浏览器在我已经安全的情况下还要保护我”。换句话说,既然内联 CSS 和脚本与包含(外部)CSS 和脚本相同,为什么只有内联 CSS 和脚本被标准人员和 CSP 视为不安全?任何使用注入的内联代码都可以进行预处理以消除注入尝试。不是吗? - David Spector
浏览器不保护站点/页面发布者,而是保护浏览器用户。假设您的网站的ISP或主机,或您发布广告的广告商将脚本注入您的页面。如果该脚本在单独的文件中,则隐式的同源策略可以确保您的安全 - 广告商无法下载您未经授权或自行发布的脚本。如果它是内联的,则无法判断。由于页面服务器无法预先清理从广告服务器加载的广告,因此浏览器无法信任内联脚本。 - user625488
在我的情况下,我会在呈现之前将在表单或URL中输入的任何文本转换为安全形式。传统的转义/过滤内容后再插入页面是好的、通常有效的,并且是您应该做的事情。如果由于某种原因(例如未处理模糊的边缘情况[有令人惊讶的向量]或仅在一个特定位置不适用),转义/过滤失败时,CSP可以增加额外的保护层。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接