XSS (Cross-Site Scripting) — это инъекция вредоносных скриптов на страницы, которые видят другие пользователи. Вот профессиональные методы защиты.
htmlspecialchars() — базовый способ:
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
<
, >
, "
, '
, &
в HTML-сущностиHTML Purifier (для сложных случаев):
require_once 'HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$cleanHtml = $purifier->purify($dirtyHtml);
Пример настройки:
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com");
setcookie('session', $token, [
'httponly' => true,
'secure' => true,
'samesite' => 'Strict'
]);
$data = ['content' => $userContent];
header('Content-Type: application/json');
echo json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP);
$value = htmlspecialchars($data, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
echo '<div data-value="' . $value . '">...</div>';
$json = json_encode($data, JSON_HEX_TAG);
echo '<script>var data = ' . $json . ';</script>';
Фильтрация ввода:
$cleanInput = filter_var($input, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
Белые списки разрешенных тегов (если нужно сохранить HTML):
$allowedTags = '<p><a><strong><em>';
$cleanHtml = strip_tags($html, $allowedTags);
Экранирование перед вставкой в DOM:
function escapeJs($string) {
return addcslashes($string, "\\\'\"&\n\r<>");
}
declare(strict_types=1)
) — предотвращают неявные преобразования{{ $unescaped }}
автоматически экранирует{{ var|escape('html') }}
основная защита от XSS — экранирование всех выводимых данных с помощью htmlspecialchars()
, использование CSP-заголовков и специальных библиотек для работы с HTML. Никогда не доверяйте пользовательскому вводу и применяйте защиту на всех уровнях приложения — от БД до фронтенда.