我将 jQuery 从 2.1.1 升级到 3.5.1,我开始发现 jQuery 存在这个问题
<块引用>拒绝执行内联脚本,因为它违反了以下内容 内容安全策略指令:“script-src 'self' 'nonce-YURLOAQRrIwdGEqYSSpHx9YSWDM ......''不安全评估'”。 'unsafe-inline' 关键字,一个散列 ('sha256-2mvMk0Nvn96VqS1UEmAZSVSEkK0CkPN ....'),或一个随机数 ('nonce-...') 是启用内联执行所必需的。
我不想使用'unsafe-inline'。
该问题在 2017-2018 年记录为 here、here 和 here。我认为这个问题现在已经在 jQuery 3.5.1 中解决了,除非我遗漏了什么。
我的应用程序是在 .NET Core 5 中开发的。
Index.cshtml
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<script src="~/lib/jquery/3.5.1/jquery.min.js" asp-add-nonce="true"></script>
</head>
<body>
<button type="button" id="btnGetContent">Get Content</button>
<div id="result">
<partial name="_Test" />
</div>
<script src="~/js/index.js"></script>
</body>
</html>
_Test.cshtml 部分视图
@System.DateTime.Now.ToString();
<script type="text/javascript" asp-add-nonce="true">
// partial view specific inline script
</script>
index.js
$(function () {
$("#btnGetContent").click(function () {
$.ajax({
type: "GET",
url: "/test/getcontent",
processData: true,
cache: false
})
.done(function (response, textStatus, jqXHR) {
// in browser's console I notice the error at this line
$("#result").html(response);
})
})
})
控制器
public class TestController : Controller
{
public IActionResult Index()
{
return View();
}
[HttpGet]
public IActionResult GetContent()
{
return PartialView("_Test");
}
}
CSP 政策
"default-src 'none'; script-src 'self' 'nonce-{0}' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self'; child-src 'self';"
我有自定义的 asp-add-nonce
标签助手和一个 nonce 中间件。 ** 对于每个请求 ** 标签助手和中间件分别将新的 nonce 值注入脚本标签和 CSP 策略中,这一直工作正常。
在我将 jQuery 升级到 3.5.1 之后,看起来 jQuery 也需要脚本标签中的 nonce 值,所以我在标题中添加了 asp-add-nonce="true"
像
<script src="~/lib/jquery/3.5.1/jquery.min.js" asp-add-nonce="true"></script>
问题
我认为这里的问题是,由于为每个 http 请求创建了 nonce 值,并且每页仅加载一次 jQuery。 Get Content
请求创建的新值当然与注入到 jQuery 脚本标签中的原始值不匹配。所以我们得到错误 Refused to execute inline script...
有没有办法在不向 jQuery 的脚本标签添加随机数的情况下解决这个问题?
更新 1
看了浏览器提交的CSP报告,发现了更多细节。违反指令实际上是script-src-elem
。我的 CSP 政策甚至没有该指令。该指令在 CSP 3 版本中可用。不知道为什么浏览器会在 jQuery 上为这个指令出错。
更新 2
您可以download repository重现问题
答案 0 :(得分:0)
基于我的相关问题 here 和 here,我认为我必须为 jQuery 3.1+ 添加 script-src unsafe-inline
才能在以下场景中正常工作
1>您使用的是 jQuery 3.1+
2>jQuery 被添加到_layout 页面或主页面,所以它在开始时只加载一次。
3>您正在使用 AJAX 加载部分内容。
在 nonce
方法中,建议为每个 http 请求使用唯一的 nonce
。但他的方法在这里行不通。因为 AJAX 调用将在标头中获得不同的随机数。所以之后的任何 jQuery 调用都不起作用。
对我来说,它适用于 2.1.1,因为 jQuery 2.x parses all <script>...</script> tags from the HTML and puts it in a dynamically generated script tag or executes those through eval( )
details 而我有 script-src nonce-xyz unsafe-eval