我将jQuery从2.1.1升级到了3.5.1,我开始看到jQuery的这个问题
拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self' 'nonce-YURLOAQRrIwdGEqYSSpHx9YSWDM......' 'unsafe-eval'"。启用内联执行需要“unsafe-inline”关键字、散列('sha 256 - 2 mvMk 0 Nvn 96 VqS 1UEmAZSVSEkK 0 CkPN....')或随机数('nonce-...')。
我不想使用“非安全内联”。
该问题在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中间件。对于每个请求,标记助手和中间件分别向脚本标记和CSP策略注入新的nonce值,这一直工作正常。
在我将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>
个
问题
我认为这里的问题,因为nonce值是为每个http请求创建的,jQuery每页只加载一次. Get Content
请求创建新值,当然与jQuery脚本标记中注入的原始值不匹配。所以我们得到错误Refused to execute inline script...
有没有办法解决这个问题,而不添加nonce到jQuery的脚本标记?
更新1
在浏览器提交的CSP报告后,它揭示了更多的细节。被违反的指令实际上是script-src-elem
。我的CSP政策甚至没有这个指令。此指令在CSP 3版本中可用。不知道为什么浏览器在jQuery上为这个指令出错。
x1c 0d1x的数据
更新2
您可以download repository重新生成问题
2条答案
按热度按时间koaltpgm1#
基于我的相关问题here和here,我认为我必须为jQuery 3.1+添加
script-src unsafe-inline
才能在以下场景中正常工作1>您正在使用jQuery 3.1+
2>jQuery被添加在_layout页面或主页上,所以它只在开始时加载一次。
3>您正在使用 AJAX 加载部分内容。
在
nonce
方法中,建议对每个http请求使用唯一的nonce
。但他的方法在这里行不通。因为 AJAX 调用会在头中得到不同的nonce。所以任何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
nue99wik2#
在我的情况下,这是由于Chrome扩展,Chrome扩展试图在网站上执行一些操作,而网站阻止了它。BlazeMeter Chrome扩展出现问题。
所以只要删除Chrome扩展程序,然后再试一次。或者用其他浏览器查看。