jQuery 3.5.1和拒绝执行内联脚本,因为它违反了以下内容安全策略指令:

scyqe7ek  于 2023-08-04  发布在  jQuery
关注(0)|答案(2)|浏览(165)

我将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年记录为hereherehere。我认为这个问题现在已经在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重新生成问题

koaltpgm

koaltpgm1#

基于我的相关问题herehere,我认为我必须为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

nue99wik

nue99wik2#

在我的情况下,这是由于Chrome扩展,Chrome扩展试图在网站上执行一些操作,而网站阻止了它。BlazeMeter Chrome扩展出现问题。
所以只要删除Chrome扩展程序,然后再试一次。或者用其他浏览器查看。

相关问题