【问题标题】:How to remove unsafe inline code for Content Security Policy?如何删除内容安全策略的不安全内联代码?
【发布时间】:2012-10-29 15:42:52
【问题描述】:

我想使用内容安全策略并使我的 Django Web 应用程序安全,没有任何不安全的内联代码。但是,虽然将大部分 JavaScript 代码移动到外部文件很容易,但我也有一段我不知道修复的内联代码。我正在使用 Django,并且我在 Django 模板上下文中有一些变量,我想将其 pqww 转换为 JavaScript。所以目前我只是将它作为内联 JavaScript 输出。但由于 CSP,这不起作用。

<script type="text/javascript">
    /* <![CDATA[ */
    var documentURL = '{% filter escapejs %}{{ document.get_document_url }}{% endfilter %}';
    /* ]]> */
</script>

【问题讨论】:

  • 您可以将该值输出到隐藏字段(并通过 JavaScript 读取)
  • 更复杂的数据类型呢?例如,很容易将 dict 输出为 JSON,而 JavaScript 将其读取为对象。
  • 嗯,“简单”是一个相对术语,但是您可以做到。我不止一次使用过这种方法。
  • 最后我决定在一个空的div上使用data-属性。
  • 另一种解决方案是使用nonce-adding 中间件将nonce 添加到您的上下文中,并将相同的nonce 添加到您的CSP 标头中。使用此方法,您可以一举将所有内联脚本(和 css)转换为与 CSP 兼容(或至少一个简单的查找和替换以将 {{ nonce }} 添加到所有内联脚本)。

标签: javascript django content-security-policy


【解决方案1】:

将 cmets 放入答案形式并添加一点...

最简单的方法是生成带有属性集的标签。我不了解 django,所以我将其保留为纯 html:

<input type="hidden" id="mything" value="<MY VALUE>">

当我有多个相关的值时,我可能会将它们放入同一个元素中:

<span class="hidden" data-attribute1="<VALUE1>" data-attribute2="<VALUE2>">
<!-- rename 'attributeN' to something meaningful obviously -->

在任何一种情况下,只需使用 JS 读取值(为简洁起见使用 jquery)

$('#mything').data("attribute1")

或者,如果您需要一个复杂的对象,请将其作为 html 实体转义数据扔到一个跨度中:

<span class="hidden" id="data-container">
  <your html-escaped JSON>
</span>

并在外部文件中读取:

var myObject = JSON.parse($('#data-container').html());

这在https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.233.1_-_HTML_escape_JSON_values_in_an_HTML_context_and_read_the_data_with_JSON.parse也有描述

【讨论】:

  • 你可以做$('#mything').data("attribute1")
  • 很好,不知道。正在更新答案。
猜你喜欢
  • 2022-12-14
  • 2014-10-26
  • 2021-12-25
  • 2019-01-19
  • 2021-08-21
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多