📅  最后修改于: 2023-12-03 15:25:52.208000             🧑  作者: Mango
在现代Web应用程序中,内容安全策略(Content Security Policy,CSP)是一种重要的安全控制,可以限制浏览器从何处加载资源。CSP 的主要目的是减少攻击者针对应用程序的攻击面。
如果网站使用 CSP,浏览器将拒绝执行内联脚本,以防止潜在的跨站脚本(XSS)攻击。如果内联脚本被拒绝执行,则会显示国际化的错误消息,如下所示:
Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.
这个错误消息说明了CSP的指令,也给出了如何允许内联脚本的几种方式,如使用unsafe-inline
关键字,使用哈希或使用随机数(nonce)。
CSP指令通常使用HTTP头或元素标签中的Content-Security-Policy
字段来指定。指令分别对应不同功能:
有三种方法可以解决内联脚本被CSP拒绝执行的问题:
这种方法很方便,但不建议使用。只需要将script-src
指令中加入'unsafe-inline'关键字即可。例如:
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';">
这样就允许了内联脚本。但由于使用'unsafe-inline'可以使应用程序容易受到XSS攻击,因此不建议使用。
另一种允许内联脚本的方法是使用哈希,哈希可确保脚本内容没有被篡改。可以为允许的脚本指定一个哈希值,例如:
<script>
function say_hello() {
alert("Hello!");
}
</script>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-u4oyMdE4KjmwNe0ihbMEwiLSdzqjE9ITq3ikczs+ihY=';">
这样可以确保指定脚本内容不被篡改,但也存在一些弊端:
最后一种方法是使用随机数(nonce),与哈希类似,但更加灵活,可以确保内联脚本代码没有被篡改。随机数(nonce)是一个任意字符串,只要在同一个页面上使用相同的字符串就可以了。例如:
<script type="text/javascript" nonce="H2yidiDoodle">
function say_hello() {
alert("Hello!");
}
</script>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'nonce-H2yidiDoodle';">
在CSP中指定相同的随机数,浏览器就可以执行内联脚本了。不过,需要注意以下几点:
在开发Web应用程序时, CSP 是一种重要的安全机制,可以大大减少Web应用程序的风险。在使用 CSP 时,需要非常小心,确保配置正确,避免应用程序容易受到攻击。