HTML" nonce"的目的是什么?脚本和样式元素的属性?

时间:2017-03-21 09:18:27

标签: html html5 attributes content-security-policy nonce

W3C表示HTML5.1中有一个名为 public class GoalServiceImpl implements GoalService{ private final Logger log = LoggerFactory.getLogger(GoalServiceImpl.class); @Inject private GoalRepository goalRepository; @Inject private GoalMapper goalMapper; @Inject private GoalSearchRepository goalSearchRepository; @Inject private TagRepository tagRepository; /** * Save a goal. * * @param goalDTO the entity to save * @return the persisted entity */ public GoalDTO save(GoalDTO goalDTO) { log.debug("Request to save Goal : {}", goalDTO); Goal goal = goalMapper.goalDTOToGoal(goalDTO); goal = goalRepository.save(goal); GoalDTO result = goalMapper.goalToGoalDTO(goal); //goalSearchRepository.save(goal); return result; } 的{​​{1}}和nonce新属性,可供网站的内容安全政策使用。

我用谷歌搜索了它,但最终没有得到它实际上这个属性做什么以及使用它时会发生什么变化?

1 个答案:

答案 0 :(得分:110)

nonce属性可让您将某些内联scriptstyle元素“列入白名单”,同时避免使用CSP unsafe-inline指令(允许所有内联script / style),以便您仍然保留禁用内联script / style的关键CSP功能。

因此,nonce属性是告诉浏览器特定脚本或样式元素的内联内容未被某些(恶意)第三方注入文档的方式,而是有意将其放入文档中谁控制服务器文件的服务。

https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it提供了如何使用nonce属性的一个很好的示例,该属性归结为以下步骤:

  1. 对于Web服务器为特定文档接收的每个请求,让后端从加密安全随机数生成器生成至少128位数据的随机base64编码字符串;例如,EDNnf03nceIOfn39fn3e9h3sdfa。那是你的现时。

  2. 获取步骤1中生成的随机数,对于要“白名单”的任何内联script / style,请将后端代码插入nonce属性在通过网络发送之前的文档,以nonce作为值:

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">…</script>
    
  3. 获取步骤1中生成的nonce,在其前面添加nonce-,并使后端生成一个CSP标头,其中包含script-src或{{1}源列表中的值}}:

    style-src
  4. 因此,使用nonce的机制是替代,让后端生成您想要允许的内联Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa' script内容的哈希值,然后指定该哈希值。 CSP标题中的相应源列表。

    请注意,因为浏览器不会(不能)检查发送的现时值是否在页面请求之间发生变化,所以可以 - 尽管完全不可取 - 跳过上面的1并且不让后端为nonce动态执行任何操作,在这种情况下,您可以将带有静态值的style属性放入文档的HTML源代码中,并发送具有相同nonce值的静态CSP标头。

    但是你不想以这种方式使用静态nonce的原因是,它几乎完全违背了使用nonce开头的全部目的 - 因为,如果你要使用静态nonce就这样,那时你也可以使用nonce