2013-02-22 61 views
0

我正在构建一个使用(动态插入)JavaScript修改网页的工具。任何网页。导航后立即执行代码:浏览器插件?

这个想法是允许用户使用它来记录对现有网页(如google.com)的一系列更改(例如,假设更改是将10像素纯黑色边框应用于所有<img>标签,这种变化显然可以编码为jQuery的简短小贴士),如果您愿意(在这种情况下为google.com),该工具会生成一个包含此元数据和表示“起点”的url的链接(或标识符)。

现在我遇到的问题是整个同源安全策略,其目的是明确否认它看起来像我需要做的确切类型的事情。

我需要做的是本质上导航到一个特定的网站,然后在该网站的上下文中执行JavaScript。我(工具的作者)以及我与我分享我的脚本的用户都不必控制站点,因此理论上,安全模型如果得到正确实施,应该可以防止这个概念发挥作用。

正因为如此,我不能有一个单一的可点击的链接,启动一些网站上运行我的代码的过程。这完全有意义。如果攻击者网站发送一个变相的可点击链接,它将运行代码,在任何他们想要的网站上扮演我的角色,这将变得微不足道。

但是,解决此问题的方法是告诉收件人执行单个附加步骤。首先,他们像通常一样打开网站的URL,然后他们将一点点javascript:(function(){.....})();粘贴到URL/omni栏中。这是(AFAICT)完全合法的,应该是允许的,因为用户知道这个脚本正在执行。现在是否应该允许它轻松运行JS或多或少不相关,因为它现在基本上都可以工作。

这并不算太坏,但我认为用户体验不必要地受到影响。例如,它看起来像一个本地应用程序将有必要获得比将iOS粘贴到iOS设备上的URL栏更好的效果,但是在插件接受的完整浏览器上,它看起来像一个插件可以实现我想要的效果。

这是一个导航到一个任意的URL,然后执行代码(这个代码来自一个授权的源代码)只需点击一下。

但我不确定从哪里开始。什么API可以为我提供这种能力?我希望能够脱离Greasemonkey类型的脚本(因为Greasemonkey兼容插件几乎适用于所有优秀的浏览器),但我不知道是否有足够的可用功率。

对于与安全相关的问题,我仍然有点不确定。我以前在这里有一个很大的段落,但这一切都归结为“社会工程”。

回答

0

这种东西通常用bookmarklets完成。

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

您的书签可以直接包含您的脚本,也可以是一个简单的加载程序,它将一个<script src=http://mywebsite.com/script.js">标签注入到文档中,这样您就可以更新脚本并将其“分发”给所有用户。

+0

哦,我喜欢那样!在服务器端更新脚本。那里有好的见解。 – 2013-02-22 16:30:15

0

安全始终关乎知识。或者换句话说:不了解某些东西会让你感到不安全。

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

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

  1. 您尝试bookmarklet
  2. 您可以使用浏览器插件一样Greasemonkey

两者都允许运行任意JavaScript。前者每次需要用户明确许可,后者自动执行。当然,如果将功能的核心移动到一个偏远的地方,即使像我这样的知识渊博的用户也很难理解和信任正在发生的事情。

这就是当函数的肉不在书签或书签中,而是用一个远程URL添加<script>标签时。这会让你很难确保你的脚本不会做一些“奇怪”的事情。例如,当我尝试在不使用书签的情况下下载JavaScript时,您可能会返回不同的脚本。

+0

Greasemonkey可以自动执行非预定的代码吗?它允许这样的事情吗?用户A需要发送给用户B(拥有Greasemonkey)多个不同的脚本/配置链接,我希望用户B能够在不单独安装它们的情况下执行它们(如小书签或将脚本粘贴到URL栏中所需)。 – 2013-02-22 16:28:45

+0

你可以在greasemonkey中做一个AJAX请求,并在成功结果上调用'eval()'吗? – 2013-02-25 12:55:28

+0

是的,但仅此而已。 – 2013-02-25 13:20:44