В двух словах о CSP
CSP (Content Security Policy) — стандарт защиты сайтов от атак с внедрением контента, например XSS — межсайтового скриптинга. CSP описывает безопасные источники загрузки и блокирует ресурсы, которые не входят в «белый список»
Что решает Nonce для CSP
Зачем использовать атрибут Nonce? Использование атрибута nonce в тегах скриптов значительно повышает безопасность вашего веб-сайта. Nonce – это случайно сгенерированное значение, которое позволяет запускать определенные скрипты, блокируя потенциально опасные. Вот почему это важно:
- Повышает веб-безопасность: позволяя использовать только скрипты с допустимым nonce, вы можете предотвратить несанкционированное выполнение кода
- Уменьшает количество ошибок в консоли браузера: Недопустимые теги скриптов могут привести к ошибкам в консоли, которые влияют на производительность сайта и удобство работы с пользователем
Если для всех скриптов темы вы можете добавить обработку подмены <script на <script nonce=, то для AMP необходим другой подход
Решите потенциальные проблемы
Создайте плагин ampnonce и разместите там следующий код (где замените foo на свое значение nonce):
<?php
/**
* Plugin Name: Nonce for AMP WordPress
* Plugin URI: https://milordk.ru
* Description: Nonce in AMP WordPress (refact https://github.com/rtCamp/amp-generic-compat)
* Author: Jettochkin
* Author URI: https://milordk.ru
* Text Domain: nonceamp
* Domain Path: /languages
* Version: 1.0.0
*
* @package NONCEAMP
*/
namespace AMP_CSP_Scripts;
use AmpProject\Optimizer\Transformer;
use AmpProject\Dom\Document;
use AmpProject\Optimizer\ErrorCollection;
use DOMElement;
class ScriptNonceTransformer implements Transformer {
public function transform( Document $document, ErrorCollection $errors ) {
$scripts = $document->xpath->query( '//script[ not( @type ) or @type = "module" ]' );
foreach ( $scripts as $script ) {
/** @type DOMElement $script */
$script->setAttribute( 'nonce', 'foo' );
}
}
}
add_filter(
'amp_optimizer_config',
static function ( $config ) {
$config['transformers'][] = ScriptNonceTransformer::class;
return $config;
}
);
Используя этот плагин, вы обеспечиваете плавную интеграцию атрибутов nonce в свои AMP-скрипты, поддерживая соответствие стандартам безопасности и оптимизируя производительность