为什么 bookmarklet 在 Twitter 上不起作用

Why bookmarklet does not worrk on twitter

我从 here 中获取了以下书签:

javascript:var a='';
for(var ln=0;ln<document.links.length;ln++)
   {var lk=document.links[ln];
    a+=ln+': <a href=\''+lk+'\' title=\''+lk.text+'\'>'+lk+'</a><br>\n';
   }
w=window.open('','Links','scrollbars,resizable,width=800,height=600');
w.document.write(a)

为什么它在 Twitter 主站点上不起作用: https://twitter.com/search?q=from%3Abmw%20since%3A2016-07-01%20until%3A2016-07-31&src=typd

它在移动网站上运行完美: https://m.twitter.com/search?q=from%3Abmw%20since%3A2016-07-01%20until%3A2016-07-31&src=typd

要使用此小书签,请将其拖到您的书签栏,然后单击它。

这是一个 CSP(内容安全策略)问题。

使用 CSP,站点可以决定允许哪些脚本 运行。 Twitter、GitHub 和其他一些人禁用了内联脚本,这导致小书签在他们的网站上无法使用。

虽然 CSP 规范允许浏览器绕过此类限制以保持小书签、用户脚本等功能正常,但并未强制执行。 (它曾经是,但措辞从 should 更改为 may。)不幸的是,Firefox doesn't seem to allow this 用于小书签,除非你我愿意完全禁用 CSP(security.csp.enable in about:config),我不知道有任何设置可以解决这个问题。 (扩展仍然有效。)它在 Chrome 中有效——这就是为什么 @albert 无法重现你的问题。

您可以自己尝试:转到 Twitter 并在地址栏中输入类似 javascript:alert('hello') 的内容。什么都不会发生,如果您打开 JS 控制台并启用安全日志,您会看到 CSP 阻止了您的脚本 运行ning。

所以,简而言之:Bookmarklets 被牺牲在所谓的安全利益的祭坛上。