在现代浏览器中,JavaScript bookmarklet是否存在安全限制?

在现代浏览器中,JavaScript bookmarklet是否存在安全限制?,javascript,security,browser,bookmarklet,javascript-injection,Javascript,Security,Browser,Bookmarklet,Javascript Injection,我读过一篇关于bookmarklet的文章,上面说bookmarklet功能强大,可能会很危险。例如,恶意bookmarklet可以收集您的“cookies”、“localStorage”以及密码输入框中的字符串,然后将其发送到远程服务器,这类似于“脚本注入” 我对此很好奇。由于这篇文章是在2007年(8年前)写的,所以对于bookmarklet(以及浏览器插件)在现代浏览器中提高安全性是否有任何限制?bookmarklet是由用户运行的脚本。是的,它们可以完成您提到的所有事情(限制方式与您将它

我读过一篇关于bookmarklet的文章,上面说bookmarklet功能强大,可能会很危险。例如,恶意bookmarklet可以收集您的“cookies”、“localStorage”以及密码输入框中的字符串,然后将其发送到远程服务器,这类似于“脚本注入”


我对此很好奇。由于这篇文章是在2007年(8年前)写的,所以对于bookmarklet(以及浏览器插件)在现代浏览器中提高安全性是否有任何限制?

bookmarklet是由用户运行的脚本。是的,它们可以完成您提到的所有事情(限制方式与您将它们注入页面中的任何其他代码都是有限的方式相同),但仅当用户触发它们时。它们确实是脚本注入,但脚本注入是由机器负责人完成的。通过打开浏览器的开发人员工具,用户至少可以做同样多的事情,实际上可以做更多的事情


但回答您实际提出的问题:不,我不认为过去几年中对bookmarklet有任何新的限制。

内容安全策略无意影响bookmarklet:

强制执行CSP策略不应干扰用户提供的脚本(如第三方用户代理插件和JavaScript bookmarklet)的操作

但有一些意想不到的后果:

书签。人们爱他们,CSP打破了他们

例如,Instapaper注入一个脚本标记,以从Instapaper的源代码加载instapapering代码。我怀疑它最终也会注入CSS。尽管bookmarklet本身按预期执行,但它在页面上的操作受页面策略的约束,因此这些加载可能会被阻止。在mikewest.org和github.com上,情况确实如此

CSP阻止加载外部脚本的
javascript:
协议URI:

每当用户代理执行javascript URI中包含的脚本时,用户代理都不能执行该脚本。(即使在强制执行此限制时,用户代理也应执行“bookmarklets”中包含的脚本。)

解决这个问题可以让我的大多数bookmarklet工作,但对Pocket和SubToMe等服务相关的bookmarklet没有帮助。这些bookmarklet加载外部脚本,这些脚本将被GitHub的script src CSP指令阻止

scriptsrc
可以通过开发人员工具或用户脚本运行bookmarklet代码来规避,但这不是重点

…虽然您可以使用什么URL将脚本插入受CSP保护的特定文档中受到限制,但您可以将任何文本直接插入文档中

将bookmarklet转换为脚本标记的userscript是另一种解决方法

参考资料


我所知道的是,如果不在开始时手动键入“javascript:,就无法自动创建JS bookmarklet。