【发布时间】:2014-01-29 21:33:41
【问题描述】:
我正在使用以下策略实现 Content Security Policy 标头
Content-Security-Policy: default-src 'self'
所以需要避免内联脚本,因为它不会执行。
但是,在 MVC 应用程序中,某些功能(例如编辑器模板)使用内联脚本。例如tinymce_jquery_full.cshtml 包含
$(function() {
$('#@ViewData.TemplateInfo.GetFullHtmlFieldName(string.Empty)').tinymce({
...
使用 CSP 时,在外部 .js 文件中包含动态值的好方法是什么?
我目前的想法是两种方式之一:
C# 生成的 JavaScript
类似于JSONP 的工作方式,除了在 URL 中我没有指定回调 - 我只是传递动态值。在每个需要动态 JavaScript 的文件中,我都包含一个链接,例如
<script src="/script/Foo/bar"></script>
点击ScriptController 的Foo 操作,该操作返回text/javascript 类型的内容,插入动态值bar。这让我觉得这是一种可靠的方式,如果有点笨拙并且它首先破坏了使用 CSP 的一些优势(几乎就像没有 CSP 一样容易意外插入未编码的文本并导致XSS) .
隐藏的表单域
动态值被插入到页面中:
<input type="hidden" id="url" name="url" value"http:://www.example.com/" />
这些值在外部 JavaScript 文件中查找:
$('#url').val();
这会起作用,但如果页面上有多个动态控件或有多个相同类型的控件,则可能会很尴尬。问题是如何有效地将每个.js 脚本与其隐藏字段匹配。
有没有更好的解决方案或者我可以使用任何现成的框架?
【问题讨论】:
标签: c# javascript asp.net-mvc security content-security-policy