如何在Apache、Nginx和WordPress中实现CSP frame-ancestors?

通过实施CSP(内容安全策略)头部,保护您的网站免受点击劫持攻击

CSP是OWASP十大安全头部之一,通常被安全专家或工具推荐实施。有许多选项可用于构建策略,以强制执行您希望公开的Web资源的方式。

其中一个被称为frame-ancestors的指令在CSP版本2中引入,与frame-ancestors相比,该指令提供了更大的灵活性,能够以与X-Frame-Options相同的方式允许或禁止使用iframe、frame、object、embed和applet元素嵌入资源。

我认为当CSP与所有主要浏览器完全兼容时,X-Frame-Options将很快过时。截至目前,CSP frame-ancestors支持所有最新的浏览器版本,除了IE。

我不知道微软何时将在IE上提供支持。您可以随时在Can I Use site上检查浏览器的兼容性。

让我们看一下以下的实施步骤。

Apache HTTP

在Apache中注入任何头部都需要先决条件mod_headers。根据操作系统和版本的不同,但如果您使用的是Ubuntu和Apache 2.4,则可以使用a2enmod headers来启用它。

root@yaoweibin:/etc/apache2# a2enmod headers
Enabling module headers.
To activate the new configuration, you need to run:
  systemctl restart apache2
root@yaoweibin:/etc/apache2# systemctl restart apache2
root@yaoweibin:/etc/apache2#

注意:您可以在httpd.conf文件或您正在使用的任何有效配置文件中进行所有配置。

拒绝所有

与X-Frame-Options DENY类似。如果您不希望任何网站(包括自己)进行嵌入,则添加以下内容。

Header set Content-Security-Policy "frame-ancestors 'none';"

保存文件并重新启动Apache HTTP以生效。

我尝试嵌入网站,正如您所见,它被阻止了。

允许自己,但拒绝他人

与X-Frame-Options SAMEORIGIN类似,您可以添加以下内容。

Header set Content-Security-Policy "frame-ancestors 'self';"

允许自己和多个域名

X-Frame-Options没有选项允许多个域名。感谢CSP,您可以按如下方式执行。

Header set Content-Security-Policy "frame-ancestors 'self' 'yaoweibin.com' 'gf.dev' 'yaoweibin.dev';"

上述代码将允许从自己、yaoweibin.com、gf.dev和yaoweibin.dev嵌入内容。将这些域名更改为您自己的域名。

Nginx

与Apache HTTP部分中解释的概念和指令相同,只是添加头部的方式不同。在Nginx中,头部应添加在相应配置文件的server块下。

拒绝所有

add_header Content-Security-Policy "frame-ancestors 'none';";

拒绝所有,但不拒绝自己

add_header Content-Security-Policy "frame-ancestors 'self';";

允许多个域名

add_header Content-Security-Policy "frame-ancestors 'yoursite.com' 'example.com';";

上面的示例将允许在yoursite.com和example.come上嵌入内容。更改完成后,不要忘记重启Nginx服务器以测试策略。

WordPress

这取决于您如何托管WordPress。

如果您使用的是自托管的云端或VPS,那么您可能正在使用像Apache或Nginx这样的网络服务器。如果是这样的话,您可以按照上述提到的方法在网络服务器上实施,而不是在WordPress上实施。然而,如果您在shared hosting上或无法访问修改网络服务器,则可以利用插件。

要在WordPress中实施CSP,您可以使用Content Security Policy Pro plugin

验证

完成实施后,您可以使用浏览器内置的开发者工具或链接_6来进行验证。

结论

CSP是一种强大的措施,用于防止网络漏洞。我希望上述说明能指导您如何在Apache和Nginx中实施frame-ancestors。

类似文章