Content-Security-Policy
是自2015年以来被web浏览器广泛采用的安全标准吗. 它允许设置一个HTTP头,该头将允许加载脚本的资源列入白名单.
The Problem
入侵者可能通过SQL注入(或其他漏洞)向页面添加一些带有恶意代码的脚本(或外部脚本文件).
The Solution
通过添加正确的HTTP标头, 您可以确保只有来自白名单的脚本才会被加载并在页面上运行. 要在WordPress中添加标题,开发人员可以使用 send_headers
方法将下面的代码添加到 function.php
of a given theme:
add_action( 'send_headers', 'add_csp_headers' ); function add_csp_headers() {
header("Content-Security-Policy: default-src 'self' ");
}
There are other headers也可以用来配置CSP.
为WordPress配置CSP是相当具有挑战性的,因为插件需要内联JS, third-party libraries, etc. 甚至WordPress核心代码也有一些内联JS代码. 在写这篇文章的时候,关于 使WordPress对csp友好 isn’t finished yet.
In my opinion, 每个网站所有者都应该在安全性和维护难度之间找到适合自己情况的平衡. 如果发生XSS攻击会有多危险? 对于个人博客和基于WordPress的复杂服务来说,答案是不同的.
使您的网站对csp友好, 将尽可能多的内联JS和CSS的使用移到外部文件中, and add a nonce
part to
不能在外部制作的标签. The nonce
是一个随机字符串,应该是唯一的每个请求,并与CSP头中提到的一个相吻合.
有些文章建议添加an unsafe-inline
header. Don’t do it! 它提供了使用CSP的外观,但禁用了对运行注入脚本的保护. (有些人认为这是因为它很容易使CSP与WordPress“工作”.)
改变WordPress呈现脚本的方式是可能的 script_loader_tag
filter:
Add_filter ('script_loader_tag', 'add_nonce_to_script_tag', 10,3);
add_nonce_to_script_tag($tag, $handle, $src) {
$nonce = bin2hex(random_bytes(32));
$replace = sprintf("javascript' nonce='%s' ", $nonce);
$tag = str_replace("javascript'", $replace, $tag);
return $tag;
}
Do not use wp_create_nonce()
要生成一个nonce,因为它至少在12小时内生成相同的nonce(默认为24小时).
The filter for script_loader_tag
将工作的一切,除了,不幸的是,为脚本添加 wp_localize_script()
和HTML部分,其中WordPress硬编码
tag. 解决方案可能是过滤所有由WP生成的代码 before outputting 直到核心WP团队找到合适的解决方案.
函数回调($buffer) {
$nonce = bin2hex(random_bytes(32));
$replace = sprintf("
这不会防止存储的XSS,但它有助于防止基于dom的XSS.