【问题标题】:JavaScript: Prevent execution of javascript:-URIs assigned to location.hrefJavaScript:阻止执行分配给 location.href 的 javascript:-URI
【发布时间】:2017-12-22 13:17:57
【问题描述】:

我目前正在为自己开发一个 webextension (Firefox:latest),它可以阻止/捕获函数,这些函数能够评估和执行字符串作为 javascript 代码(例如,eval、Function constructor、setTimeout)。

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

例如:

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

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

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

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

【问题讨论】:

标签: javascript content-security-policy


【解决方案1】:

假设您希望阻止对 href 属性设置为 javascript:alert('Hello there') 的简单链接执行 Javascript。

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

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

在下面的 sn-p 中,我使用属性选择器来选择所有 href 值以 javascript 开头的元素。

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

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

【讨论】:

  • 非常感谢您的评论。这是处理链接元素中的 javascript:-URIs 的好主意。但是,我正在寻找一种解决方案来阻止通过 location-object(它不是 HTMLElement)执行代码。
  • @user9131077 我不确定你指的是什么。负责执行 javascript 的不是位置对象。它是网址。例如,如果您将以下内容复制并粘贴到 URL 栏中,则会向您发出警报:javascript:alert('Hello there')
  • 你当然是正确的,位置对象本身并没有执行脚本,而是执行的“机制”,一旦浏览器加载这样的 URL(例如,当位置对象得到这样的分配的网址)。很抱歉上一篇中的误导性措辞。评论.. 但是,您是否偶然知道防止执行此类 URL 的方法?
猜你喜欢
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 2012-04-18
  • 2017-05-07
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
相关资源
最近更新 更多