为什么书签脚本被阻止?网页 CSP 似乎还可以
Why is bookmarklet script blocked? Webpage CSP seems ok
我有一个书签。当用户单击小书签时,它会插入一小段代码。此代码插入一个脚本元素,该元素又会获取执行该工作的实际脚本。
这适用于大多数网站,但有些网站会通过其内容安全政策阻止脚本。例如,他们可能
content-security-policy: script-src 'self'
不过有些网站脚本被屏蔽了,但是我看不出是什么策略屏蔽的。一种情况是bbc.co.uk,例如https://www.bbc.co.uk/food/recipes/korean-style_mapo_tofu_50944
在开发者工具的网络选项卡中,它说 myscript.js 是
blocked(csp)
但是,我没有像其他阻止脚本的网站那样看到此页面的 csp 政策。
什么阻止了脚本请求?
这是完整的小书签代码。 myscript.js 替换为通用库,以便其他人可以测试。
javascript:(函数(){var s=document.createElement('script');s.setAttribute('src','https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js?'+ new Date().getTime());document.getElementsByTagName('body')[0].appendChild(s);})();
更漂亮:
javascript:(function(){
var s=document.createElement('script');
s.setAttribute('src','https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js?'+new Date().getTime());
document.getElementsByTagName('body')[0].appendChild(s);
})();
日期参数只是为了防止网页使用缓存版本。
bbc.co.uk
在元标记中发布内容安全策略:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: http: https: 'unsafe-inline' 'unsafe-eval';
frame-src edigitalsurvey.com chartbeat.com static2.chartbeat.com *.bbc.co.uk *.bbci.co.uk *.bbc.com *.bbci.com *.edigitalsurvey.com edigitalsurvey.com *.optimizely.com cdn-assets-prod.s3.amazonaws.com twitter.com *.twitter.com *.twimg.com riddle.com *.riddle.com;
connect-src 'self' edigitalsurvey.com *.bbc.co.uk *.bbci.co.uk *.bbc.com *.bbci.com *.edigitalsurvey.com edigitalsurvey.com *.optimizely.com cdn-assets-prod.s3.amazonaws.com twitter.com *.twitter.com *.twimg.com;
font-src 'self' *.bbc.co.uk *.bbci.co.uk *.bbc.com *.bbci.com *.edigitalsurvey.com edigitalsurvey.com *.optimizely.com cdn-assets-prod.s3.amazonaws.com twitter.com *.twitter.com *.twimg.com;
form-action 'self' *.bbc.co.uk *.bbci.co.uk *.bbc.com *.bbci.com *.edigitalsurvey.com edigitalsurvey.com *.optimizely.com cdn-assets-prod.s3.amazonaws.com twitter.com *.twitter.com *.twimg.com;
img-src 'self' app.optimizely.com cdn.optimizely.com data: https: http:;
script-src 'self' static.chartbeat.com static2.chartbeat.com 'unsafe-inline' 'unsafe-eval' *.bbc.co.uk *.bbci.co.uk *.bbc.com *.bbci.com *.edigitalsurvey.com edigitalsurvey.com *.optimizely.com cdn-assets-prod.s3.amazonaws.com twitter.com *.twitter.com *.twimg.com optimizely.s3.amazonaws.com;
style-src 'self' 'unsafe-inline' *.bbc.co.uk *.bbci.co.uk *.bbc.com *.bbci.com *.edigitalsurvey.com edigitalsurvey.com *.optimizely.com cdn-assets-prod.s3.amazonaws.com twitter.com *.twitter.com *.twimg.com" />
不幸的是,如果网页有自己的 CSP,它会阻止书签脚本。
我有一个书签。当用户单击小书签时,它会插入一小段代码。此代码插入一个脚本元素,该元素又会获取执行该工作的实际脚本。
这适用于大多数网站,但有些网站会通过其内容安全政策阻止脚本。例如,他们可能
content-security-policy: script-src 'self'
不过有些网站脚本被屏蔽了,但是我看不出是什么策略屏蔽的。一种情况是bbc.co.uk,例如https://www.bbc.co.uk/food/recipes/korean-style_mapo_tofu_50944
在开发者工具的网络选项卡中,它说 myscript.js 是
blocked(csp)
但是,我没有像其他阻止脚本的网站那样看到此页面的 csp 政策。
什么阻止了脚本请求?
这是完整的小书签代码。 myscript.js 替换为通用库,以便其他人可以测试。
javascript:(函数(){var s=document.createElement('script');s.setAttribute('src','https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js?'+ new Date().getTime());document.getElementsByTagName('body')[0].appendChild(s);})();
更漂亮:
javascript:(function(){
var s=document.createElement('script');
s.setAttribute('src','https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js?'+new Date().getTime());
document.getElementsByTagName('body')[0].appendChild(s);
})();
日期参数只是为了防止网页使用缓存版本。
bbc.co.uk
在元标记中发布内容安全策略:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: http: https: 'unsafe-inline' 'unsafe-eval';
frame-src edigitalsurvey.com chartbeat.com static2.chartbeat.com *.bbc.co.uk *.bbci.co.uk *.bbc.com *.bbci.com *.edigitalsurvey.com edigitalsurvey.com *.optimizely.com cdn-assets-prod.s3.amazonaws.com twitter.com *.twitter.com *.twimg.com riddle.com *.riddle.com;
connect-src 'self' edigitalsurvey.com *.bbc.co.uk *.bbci.co.uk *.bbc.com *.bbci.com *.edigitalsurvey.com edigitalsurvey.com *.optimizely.com cdn-assets-prod.s3.amazonaws.com twitter.com *.twitter.com *.twimg.com;
font-src 'self' *.bbc.co.uk *.bbci.co.uk *.bbc.com *.bbci.com *.edigitalsurvey.com edigitalsurvey.com *.optimizely.com cdn-assets-prod.s3.amazonaws.com twitter.com *.twitter.com *.twimg.com;
form-action 'self' *.bbc.co.uk *.bbci.co.uk *.bbc.com *.bbci.com *.edigitalsurvey.com edigitalsurvey.com *.optimizely.com cdn-assets-prod.s3.amazonaws.com twitter.com *.twitter.com *.twimg.com;
img-src 'self' app.optimizely.com cdn.optimizely.com data: https: http:;
script-src 'self' static.chartbeat.com static2.chartbeat.com 'unsafe-inline' 'unsafe-eval' *.bbc.co.uk *.bbci.co.uk *.bbc.com *.bbci.com *.edigitalsurvey.com edigitalsurvey.com *.optimizely.com cdn-assets-prod.s3.amazonaws.com twitter.com *.twitter.com *.twimg.com optimizely.s3.amazonaws.com;
style-src 'self' 'unsafe-inline' *.bbc.co.uk *.bbci.co.uk *.bbc.com *.bbci.com *.edigitalsurvey.com edigitalsurvey.com *.optimizely.com cdn-assets-prod.s3.amazonaws.com twitter.com *.twitter.com *.twimg.com" />
不幸的是,如果网页有自己的 CSP,它会阻止书签脚本。