技术频道


使用 nonce 与 CSP 避免 XSS 攻击

什么是 nonce(随机数)?


nonce 可以将单词定义为仅可使用一次的单词或短语。如果您是 Spy,则可能想出一个随机数作为代码字来验证集合点。

对于(CSP)的随机数,要记住的重要一点是我们只使用一次随机数(用于一个请求),并且随机数应该如此随机,以至于没人能猜到

Nonce 使用示例


使用 nonce 是允许在内容安全策略(CSP)中执行内联脚本的最简单方法之一。这是将其与 CSP script-src 指令一起使用的方式:

script-src 'nonce-r@nd0m';
注意:我们使用短语:r@nd0m 表示一个随机值。您应该使用加密安全的随机令牌生成器来生成现时值。随机随机数值仅应用于单个 HTTP 请求

每次随机生成 nonce 方法示例(PHP)


<?php
$nonce  = md5(uniqid());
$policy = "script-src 'nonce-" . $nonce . "';";

header("content-security-policy:". $policy);
?>

Nonce 使用示例


现在,我们可以 <script> 通过 noncescript 标记的属性中添加随机随机数来允许内联标记执行:

<script nonce="r@nd0m">
  command_not_found();
</script>

CSP nonce 随机数是做什么的?


那么,为什么在使用 CSP 时需要在每个内联脚本块中添加一个 csp nonce 随机数?答案是,当您启用 CSP 时,它将禁用内联脚本标签,因此不会执行以下代码:

<script>
  command_not_found_thisWillNotExecute(); // 不会执行
</script>

这是因为浏览器不知道您编写的代码和打算让用户执行的 JavaScript 代码与攻击者已注入到页面的代码(例如,通过 XSS 漏洞)之间的区别。这些内联脚本块很危险,并且当且仅当脚本标签中的 nonce 属性与 Content-Security-Policy 头中的 nonce 值匹配时,nonce 才能使浏览器知道打算提供该脚本块的服务器

如果 CSP nonce 随机数没有意义怎么办?


在某些情况下,使用随机数没有意义,在这些情况下,您可以使用 CSP Hash 代替随机数。

这个问题还有另一种解决方法,称为 unsafe-inline,但顾名思义,使用它并不是一个好主意(在特定条件下除外)。

支持 nonce 的浏览器


nonce 源列表中的指令加入 CSP 2 级,这意味着支持已在 Chrome 和 Firefox,Safari 浏览器 10+ 或 15+ 。

注意:Internet Explorer 完全不支持随机数,您需要使用 Microsoft Edge 浏览器来获得随机数支持。

 

使用 nonce 与 CSP 避免 XSS 攻击扩展阅读:



发表评论