altis / browser-security
WordPress/Altis 浏览器安全工具
Requires
- php: >=7.1
Requires (Dev)
- phpunit/phpunit: ^7.5
README
提高您WordPress站点的浏览器安全性。
专为Altis,企业WordPress数字体验平台构建,并包含在内。
安装
您可以使用此插件作为子模块或作为Composer依赖项。
# For submodule usage: git submodule add https://github.com/humanmade/altis-browser-security.git wp-content/plugins/altis-browser-security # For Composer usage: composer require altis/browser-security
配置
如果您使用的是Altis DXP的一部分,配置将通过配置框架处理。请参阅Altis安全模块文档。
作为独立插件,您可以使用以下常量来更改此模块的行为
ABS_AUTOMATIC_INTEGRITY
(bool
): 真值启用自动生成完整性哈希,假值禁用。 (默认为真。)ABS_NOSNIFF_HEADER
(bool
): 真值发送X-Content-Type-Options: nosniff
,假值禁用。 (默认为真。)ABS_FRAME_OPTIONS_HEADER
(bool
): 真值发送X-Frame-Options: SAMEORIGIN
,假值禁用。 (默认为真。)ABS_XSS_PROTECTION_HEADER
(bool
): 真值发送X-XSS-Protection: 1; mode=block
,假值禁用。 (默认为真。)
功能
子资源完整性
此插件在可能的情况下自动添加子资源完整性哈希。这些哈希将为同一服务器上的任何文件生成;即任何插件或主题资源。
这些哈希将自动缓存在对象缓存中,与脚本或样式的文件名和版本相关联。
对于外部资源,您可以手动设置完整性哈希。在排队(或注册)您的资源后,使用set_hash_for_script()
或set_hash_for_style()
辅助函数。
// Setting hashes for scripts. use Altis\Security\Browser; wp_enqueue_script( 'my-handle', 'https://...' ); Browser\set_hash_for_script( 'my-handle', 'sha384-...' ); // Setting hashes for styles. use Altis\Security\Browser; wp_enqueue_style( 'my-handle', 'https://...' ); Browser\set_hash_for_style( 'my-handle', 'sha384-...' );
内容安全策略
此插件可以自动收集并发送内容安全策略。
默认情况下,不发送任何策略。 CSP策略通常针对特定网站,因此没有对您可能需要的假设。
向altis.security.browser.content_security_policies
添加过滤器以设置策略。此过滤器接收一个数组,其中的键是策略指令名称。每个项目可以是字符串或指令值字符串的列表。
add_filter( 'altis.security.browser.content_security_policies', function ( array $policies ) : array { // Policies can be set as strings. $policies['object-src'] = 'none'; $policies['base-uri'] = 'self'; // Policies can also be set as arrays. $policies['font-src'] = [ 'https://fonts.gstatic.com', 'https://cdnjs.cloudflare.com', ]; // Special directives (such as `unsafe-inline`) are handled for you. $policies['script-src'] = [ 'https:', 'unsafe-inline', ]; return $policies; } );
特殊指令('self'
,'unsafe-inline'
,'unsafe-eval'
,'none'
,'strict-dynamic'
)无需双引号。
如果需要,您还可以修改个别指令。
// You can filter specific keys via the filter name. add_filter( 'altis.security.browser.filter_policy_value.font-src', function ( array $values ) : array { $values[] = 'https://fonts.gstatic.com'; return $values; } ); // A filter is also available with the directive name in a parameter. add_filter( 'altis.security.browser.filter_policy_value', function ( array $values, string $name ) : array { if ( $name === 'font-src' ) { $values[] = 'https://cdnjs.cloudflare.com'; } return $values; } );
要构建内容安全策略,我们建议使用Firefox的Laboratory CSP工具包扩展和CSP评估器工具。
仅报告策略
要发送内容安全策略-仅报告头,请使用与普通CSP策略相同的上述过程,但使用替代过滤器altis.security.browser.report_only_content_security_policies
。
必须使用外部服务来处理来自“仅报告”策略的报告。外部服务将为您提供用于处理报告的URL,您可以通过添加一个具有适当URL的report-uri
指令来使用它。
例如,您可以通过筛选策略数组将报告指令添加到您的“仅报告”策略中。
add_filter( 'altis.security.browser.report_only_content_security_policies', function ( array $policies ) : array { $policies['report-uri'] = 'https://example.uriports.com/reports'; return $policies; } );
您还可以使用过滤器以相同的方式修改单个指令,用于在报告-only策略中,使用以下过滤器:
altis.security.browser.filter_report_only_policy_value.{指令名称}
altis.security.browser.filter_report_only_policy_value
可以同时使用常规和仅报告策略。
安全头部
此插件默认自动添加各种安全头部。这些遵循Web安全最佳实践,旨在提供合理、安全的基本设置。
在某些情况下,您可能需要根据您站点的使用情况调整或禁用这些头部。
Strict-Transport-Security
使用Strict-Transport-Security
头部(有时称为HSTS)用于在加载站点时强制执行HTTPS(TLS/SSL)连接,并可用于增强站点的安全性。
默认情况下,如果您的站点通过HTTPS提供服务,Altis会添加一个值为max-age=86400
(一天)的Strict-Transport-Security
头部。如果您想覆盖此值(例如,对于更长的持续时间或指定includeSubdomains
),可以定义ABS_HSTS
常量。
define( 'ABS_HSTS', 'max-age=31536000; includeSubDomains' );
要完全禁用自动行为,请将常量设置为false
define( 'ABS_HSTS', false );
X-Content-Type-Options
默认情况下,Altis会添加一个值为nosniff
的X-Content-Type-Options
头部。这防止浏览器尝试根据内容猜测内容类型,并强制它们遵循Content-Type
头部中设置的类型。
这通常应该始终发送,并且您的内容类型应该始终明确设置。如果需要禁用它,请设置ABS_NOSNIFF_HEADER
常量。
define( 'ABS_NOSNIFF_HEADER', false );
X-Frame-Options
默认情况下,Altis会添加一个值为sameorigin
的X-Frame-Options
头部。这防止您的站点被iframe到另一个站点,这可以防止点击劫持攻击。
这通常应该始终发送,但在某些情况下,您可能希望允许特定站点iframe您的站点或允许任何站点。要禁用自动头部,请设置ABS_FRAME_OPTIONS_HEADER
常量。
define( 'ABS_FRAME_OPTIONS_HEADER', false );
然后您可以根据需要发送自己的头部。我们建议挂钩到template_redirect
钩子来发送这些头部。
X-XSS-Protection
默认情况下,Altis会添加一个值为1; mode=block
的X-XSS-Protection
头部。这防止浏览器在检测到跨站脚本(XSS)攻击时加载。
这通常应该始终发送。如果需要禁用它,请设置ABS_XSS_PROTECTION_HEADER
头部。
define( 'ABS_XSS_PROTECTION_HEADER', false );
限制CORS源
默认情况下,WordPress将允许任何源发起的REST API请求。此插件添加了一个新的过滤器altis.security.browser.rest_allow_origin
来限制CORS源。
要完全禁止外部请求,请将过滤器设置为false
。
add_filter( 'altis.security.browser.rest_allow_origin', '__return_false' );
仅允许特定源
add_filter( 'altis.security.browser.rest_allow_origin', function ( $allow, $origin ) { $allowed_origins = [ 'https://www.example.com', ]; if ( in_array( $origin, $allowed_origins, true ) ) { return true; } return false; }, 10, 2 );
禁止所有本地域
add_filter( 'altis.security.browser.rest_allow_origin', function ( $allow, $origin ) { if ( false !== strpos( $origin, '.local' ) ) { return false; } return $allow; }, 10, 2 );
许可证
Altis Browser Security根据GPLv2或更高版本授权。版权所有2019年Human Made及其贡献者。