导航后立即执行代码:浏览器插件

Executing code immediately after navigation: Browser plugin?

本文关键字:浏览器 插件 代码 执行 导航      更新时间:2023-09-26

我正在构建一个使用(动态插入)JavaScript修改网页的工具。任何网页。

这个想法是允许用户使用它来记录对现有网页(如google.com)的一系列更改(为了举例,假设一个更改是对所有<img>标签应用10像素的实心黑色边框,这个更改显然可以编码为jQuery的一个简短而甜蜜的片段),并且该工具生成一个链接(或标识符),该链接包含该元数据和表示"起点"的url(在本例中为google.com)。

现在我遇到的问题是整个同源安全政策,其目的是明确否认我似乎需要做的事情

我需要做的基本上是导航到一个特定的站点,然后在该站点的上下文中执行javascript。无论是我(该工具的作者)还是与我共享脚本的用户都不一定能控制网站,因此理论上,如果安全模型实现得当,应该会阻止这个概念发挥作用。

正因为如此,我无法拥有一个可点击的链接来启动在某些网站上运行代码的过程。这也完全有道理。攻击者网站发送一个伪装的可点击链接,在他们想要的任何网站上运行充当我的代码,这将使其变得微不足道。

但是,绕过它的方法是告诉收件人再做一步。首先,他们像往常一样打开网站的URL,然后在URL/omni栏中粘贴一点javascript:(function(){.....})();。这是(AFAICT)完全合法的,应该是允许的,因为用户知道这个脚本正在执行。在这一点上,是否应该允许它如此轻松地运行JS或多或少是无关紧要的,因为它现在基本上只适用于所有地方。

这还不错,但我认为用户体验受到了不必要的影响。例如,看起来一个本地应用程序比在iOS设备上将JS粘贴到URL栏要好,但在接受完整浏览器的插件上,插件似乎可以实现我想要的。

即:导航到任意URL,然后单击执行代码(此代码源自授权来源)。

但我不知道从哪里开始。什么API可以为我提供这种能力?我希望我可以摆脱Greasemonkey类型的脚本编写(因为几乎所有好的浏览器都可以使用Greasemonkey-兼容的插件),但我不知道是否有足够的电源可用。

事实上,我仍然有点不确定与安全相关的问题。我曾经在这里有一个很大的段落,但它可以归结为"社会工程"。

这类事情通常是用bookmarklet完成的。

在包含脚本的网站上,创建一个具有href="javascript:(function(){/* ... */})()"的链接。然后,用户可以简单地将该链接拖放到他的收藏夹中(将其作为书签)。并将其用作收藏夹栏中的按钮。

你的bookmarklet可以直接包含你的脚本,或者一个简单的加载程序,将<script src=http://mywebsite.com/script.js">标记注入文档,这样你就可以更新你的脚本并将其直接"分发"给所有用户。

安全始终与知识有关。或者反过来说:不知道一些事情会让你感到不安全。

没有一种安全的方法可以做你想做的事,那就是我的网络浏览器默认情况下禁止这样做。有一些变通方法(如上面所解释的粘贴URL),但所有这些方法都是安全的,只要用户知道她在做什么。

这就是社会影响。现在的技术解决方案:

  1. 你尝试书签
  2. 你可以使用类似Greasemonkey的浏览器插件

两者都允许运行任意JavaScript。前者每次都需要用户的明确权限,后者会自动执行。

当然,如果你把功能的核心转移到一个偏远的地方,即使是像我这样知识渊博的用户也很难理解和信任正在发生的事情

也就是说,函数的核心不在bookmarklet或防油精脚本中,而是添加了一个带有远程URL的<script>标签。这将使你更难确保你的脚本不会做一些"奇怪"的事情。例如,当我尝试在不使用bookmarklet的情况下下载JavaScript时,您可以返回不同的脚本。