Handling WordPress-Specific Challenges
Handling WordPress-Specific Challenges
WordPress's unique architecture requires specific solutions for common CSP implementation challenges.
Managing Inline Scripts:
// Function to make WordPress inline scripts CSP-compliant
function wp_csp_inline_script_handler() {
add_filter('wp_inline_script_tag', function($tag, $handle, $script) {
$nonce = wp_create_nonce('csp_inline_script');
// Add nonce to inline script tags
if (strpos($tag, 'nonce=') === false) {
$tag = str_replace('<script', '<script nonce="' . esc_attr($nonce) . '"', $tag);
}
return $tag;
}, 10, 3);
}
// Handle WordPress admin inline scripts
function wp_admin_csp_compatibility() {
?>
<script nonce="<?php echo esc_attr(wp_create_nonce('admin_inline')); ?>">
// Move inline event handlers to addEventListener
document.addEventListener('DOMContentLoaded', function() {
// Replace inline onclick handlers
document.querySelectorAll('[onclick]').forEach(function(element) {
const handler = element.getAttribute('onclick');
element.removeAttribute('onclick');
element.addEventListener('click', new Function(handler));
});
});
</script>
<?php
}
add_action('admin_footer', 'wp_admin_csp_compatibility');
Plugin Compatibility Layer:
class WP_CSP_Plugin_Compatibility {
private $plugin_configs = [];
public function __construct() {
$this->load_plugin_configs();
add_filter('wp_csp_directives', [$this, 'apply_plugin_configs']);
}
private function load_plugin_configs() {
// WooCommerce
$this->plugin_configs['woocommerce'] = [
'script-src' => [
'https://checkout.stripe.com',
'https://js.stripe.com',
'https://www.paypal.com'
],
'frame-src' => [
'https://checkout.stripe.com',
'https://www.paypal.com'
],
'connect-src' => [
'https://api.stripe.com'
]
];
// Yoast SEO
$this->plugin_configs['wordpress-seo'] = [
'script-src' => ["'unsafe-inline'"], // Required for schema markup
'style-src' => ["'unsafe-inline'"]
];
// Elementor
$this->plugin_configs['elementor'] = [
'script-src' => ["'unsafe-eval'"],
'style-src' => ["'unsafe-inline'"],
'font-src' => ['https://fonts.googleapis.com']
];
// Contact Form 7 with reCAPTCHA
$this->plugin_configs['contact-form-7'] = [
'script-src' => [
'https://www.google.com/recaptcha/',
'https://www.gstatic.com/recaptcha/'
],
'frame-src' => [
'https://www.google.com/recaptcha/'
]
];
}
public function apply_plugin_configs($directives) {
$active_plugins = get_option('active_plugins');
foreach ($active_plugins as $plugin) {
$plugin_dir = dirname($plugin);
if (isset($this->plugin_configs[$plugin_dir])) {
foreach ($this->plugin_configs[$plugin_dir] as $directive => $sources) {
if (!isset($directives[$directive])) {
$directives[$directive] = [];
}
$directives[$directive] = array_merge(
$directives[$directive],
$sources
);
}
}
}
return $directives;
}
}