tgoop.com/startpoint_dev/137
Create:
Last Update:
Last Update:
Когда-нибудь замечали в HTML что-то вроде <script nonce="abc123">
?
Nonce – это одноразовый токен, который помогает защитить сайт от XSS-атак. Когда на сайте используется механизм CSP (Content Security Policy), браузер по умолчанию блокирует все inline-скрипты. Но если очень хочется использовать их, можно, вместо указания директивы unsafe-inline
(которая будет разрешать любые такие скрипты), добавить nonce, который заранее прописан в заголовках ответа сервера. Тогда браузер выполнит только те скрипты, у которых этот токен правильный.
Пример CSP-заголовка:
Content-Security-Policy: script-src 'nonce-abc123'
Теперь в коде можно использовать:
<script nonce="abc123">console.log('Безопасный JS');</script>
<script nonce="efg567">console.log('Будет заблокирован');</script>
Обычно nonce создаётся для каждого запроса отдельно и передаётся в шаблон, чтобы его можно было подставить в скрипты.
Пример для Express:
app.use((req, res, next) => {
// Генерируем nonce
res.nonce = crypto.randomBytes(16).toString('base64');
// Устанавливаем CSP-заголовок
res.setHeader('Content-Security-Policy', `script-src 'nonce-${res.nonce}'`);
next();
});
app.get('/', (req, res) => {
res.send(`
<html>
...
<script nonce="${res.nonce}">
console.log('Этот скрипт выполнится');
</script>
</html>
`);
});
Теперь каждый запрос получает новый nonce, который передаётся в CSP-заголовке и также вставляется в HTML. Это позволяет безопасно использовать inline-скрипты, не открывая сайт для XSS.
BY Настя Котова // Frontend & Node.js
Share with your friend now:
tgoop.com/startpoint_dev/137