我正在构建一个使用(动态插入)JavaScript来修改网页的工具。任何网页。
这个想法是允许用户使用它来记录对google.com
等现有网页的一系列更改(为了举例,假设更改是对所有人应用10像素纯黑色边框<img>
标签,这个变化显然可以编码为一个简短而又甜蜜的jQuery片段,并且该工具会生成一个包含此元数据的链接(或标识符)以及表示“起点”的URL(如果您愿意)(在这种情况下google.com
)。
现在我遇到的问题是整个Same-Origin安全策略,其目的是明确否认我需要做的确切事情。
我需要做的是基本上导航到特定网站,然后在该网站的上下文中执行javascript。我(该工具的作者)和我共享我的脚本的用户都不一定能够控制该站点,因此理论上如果正确实施安全模型应该阻止这个概念起作用。
因此我无法使用单个可点击链接启动在某些网站上运行我的代码的过程。这也完全有道理。如果攻击者网站发送伪装的可点击链接,将会运行代码在他们想要的任何网站上充当我,这将使得攻击者网站变得微不足道。
但是,绕过它的方法是告诉收件人做一个单一的额外步骤。首先,他们像平常一样打开网站的网址,然后将一些javascript:(function(){.....})();
粘贴到网址/全向条中。那是(AFAICT)完全合法的,应该是允许的,因为用户知道这个脚本正在执行。是否应该允许它在这一点上如此容易地运行JS或多或少是无关紧要的,因为它现在基本上只适用于所有地方。
这不是太糟糕但我认为用户体验会受到不必要的影响。例如,看起来像是一个本机应用程序,比将iOS粘贴到iOS设备上的URL栏更好,但是在接受插件的完整浏览器上,看起来插件可以达到我想要的效果。
这是:导航到任意URL,然后执行代码(此代码来自授权来源),只需单击一下。
但我不知道从哪里开始。什么API可以为我提供这种能力?我希望我可以使用Greasemonkey类型的脚本(因为Greasemonkey兼容插件可用于几乎所有好的浏览器),但我不知道是否有足够的可用功率。
我实际上对这与安全相关的问题仍然有点不确定。我以前在这里有一个很大的段落,但这一切都归结为“社会工程”。
答案 0 :(得分:0)
这类事情通常由bookmarklets完成。
在您的网站上展示您的脚本,创建一个href="javascript:(function(){/* ... */})()"
的链接。然后,用户可以简单地将该链接拖放到他的收藏夹中(将其加入书签)。并将其用作收藏栏中的按钮。
您的书签可以直接包含您的脚本,或者在文档中注入<script src=http://mywebsite.com/script.js">
标记的简单加载程序,这样您就可以更新脚本并将其直接“分发”给所有用户。
答案 1 :(得分:0)
安全总是关于知识。或者换句话说:不知道某些事情会让你感到不安全。
没有安全的方法可以做你想要的,我的网页浏览器默认禁止它。有一些解决方法(比如粘贴你上面解释过的URL),但只要用户知道她在做什么,所有这些都是安全的。
这是社会影响。现在的技术解决方案:
两者都允许运行任意JavaScript。前者需要每次都有用户的明确许可,后者需要自动执行。
当然,如果你将功能的核心移到一个偏远的地方,那么即使像我这样知识渊博的用户也很难理解和信任正在发生的事情。
那时函数的内容不在bookmarklet或者greasemonkey脚本中,而是在你添加带有远程URL的<script>
标记时。这将使你更难确保你的脚本不做“奇怪”的事情。例如,当我尝试在不使用您的书签的情况下下载JavaScript时,您可以返回不同的脚本。