JavaScript:阻止执行 javascript:-分配给 location.href 的 URI

标签 javascript content-security-policy

我目前正在为自己开发一个网络扩展(Firefox:最新),它可以阻止/捕获函数,这些函数能够将字符串作为 javascript 代码进行评估和执行(例如,eval、函数构造函数、setTimeout)。

到目前为止,扩展程序按预期工作,但 javascript:-URI 被分配给 location/location.href。

例如:

location.href = "javascript:alert('Hello there')";

由于位置对象是不可配置的,我无法重写它(例如,设置为 null)或为其定义 setter。

我知道,“Content-Security-Policy”(不允许 unsafe-inline )能够阻止此行为,但是以这种方式使用 CSP 也会阻止内联代码的所有其他实例(例如,脚本标签之间的代码) )。 我想避免这种情况,因为它需要每一个 <script>...</script>重新插入,例如随机数。

这引出了我的问题: 有没有办法阻止/捕获这种代码执行?

最佳答案

假设您希望阻止一个简单链接执行 Javascript,该链接的 href 属性设置为 javascript:alert('Hello There')

<a href="javascript:alert('Hello there')">Click me</a>

避免这种情况的方法之一是简单地选择所有此类链接,并将 href 属性重置为无害的内容,例如 javascript:void(0) .

在下面的代码片段中,我使用属性选择器来选择具有以 javascript 开头的 href 值的所有元素。

var elems = document.querySelectorAll('[href^="javascript:"]');

for (var idx = 0; idx < elems.length; idx++) {
  elems[idx].href = "javascript:void(0)";
}
<a href="javascript:alert('Hello there')">Click me</a>

关于JavaScript:阻止执行 javascript:-分配给 location.href 的 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47942213/

相关文章:

javascript - 无法对通过 Angular REST 调用接收到的 Javascript 对象数组进行排序

javascript - 定位最近的图标以将其更改为另一个图标

facebook-javascript-sdk - Facebook登录所需的CSP规则

Flask CSP ( Content-Security-Policy ) 针对跨站脚本等攻击的最佳实践

google-chrome - 带有CSP img-src的Chrome浏览器*仍会阻止图像

google-chrome - Chrome 中的 iframe 错误 : Failed to read 'localStorage' from 'Window' : Access denied for this document

javascript - VueJS : Wait firebase to load

javascript - 如何使用React中的一个函数处理数组中的多个输入

javascript - 根据总数和奇偶数分割JSON对象

javascript - 如何从服务器获取 JavaScript,跟踪下载进度,而不是在 Content-Security-Policy 中使用 `unsafe-eval`?