脚本引起“拒绝执行内联脚本:需要使用'unsafe-inline'关键字、哈希或一次性数字来启用内联执行”。

45

我一直遇到这个错误:

拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“default-src 'self' data: gap: http://www.visitsingapore.com https://ssl.gstatic.com 'unsafe-eval'”。要启用内联执行,需要使用“unsafe-inline”关键字、哈希('sha256-V+/U3qbjHKP0SaNQhMwYNm62gfWX4QHwPJ7We1PXokI=')或 nonce('nonce-...')。还请注意,未明确设置“script-src”,因此将使用“default-src”作为后备。

有人能告诉我如何解决这个问题,以及它意味着什么吗?我的代码是:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data:gap: http://www.visitsingapore.com   https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="css/index.css">
<link rel="stylesheet" href="css/jquery.mobile-1.4.5.css">
<script src="lib/jquery-3.2.1.min.js"></script>

<script type="text/javascript" src="scripts/key.js"></script>
<script>$.ajax({
        url: ' http://www.visitsingapore.com/api.listing.en.json',
        type: 'GET',
        beforeSend: function (xhr) {
            xhr.setRequestHeader('email ID', '-------@gmail.com');
            xhr.setRequestHeader('token ID', '-------');
        },
        data: {},
        success: function (qwe12) {
            var TrueResult2 = JSON.stringify(qwe12);
            document.write(TrueResult2);
        },
        error: function () { },
    });</script>

这是一个特定于浏览器的错误吗?还是一个特定于WebKit的安全“特性”? - kent
2个回答

38

修复此问题的最佳方法是将$.ajax(…)调用从文档中提取出来,移动到名为ajax-call.js的外部文件中,然后执行以下操作:

<script src="ajax-call.js"></script>

这样做更好的理由是,如果您已经为文档设置了CSP策略,那么最好还能额外努力删除所有的内联脚本。

但是如果出于某种原因您确实需要将脚本内联到文档中,您可以更改meta元素,使错误消息中的确切sha256散列值包含在script-src指令的源中,像这样(只是为了可读性添加了一些换行):

<meta http-equiv="Content-Security-Policy"
  content="default-src 'self' data:gap: http://www.visitsingapore.com 
  https://ssl.gstatic.com 'unsafe-eval';
  style-src 'self' 'unsafe-inline';
  media-src *;
  script-src 'sha256-V+/U3qbjHKP0SaNQhMwYNm62gfWX4QHwPJ7We1PXokI='
">

以下是一些获取更多信息的地方:


1
我尝试着创建一个新的js文件,并在html文件中加入标签<script type="text/javascript" src="scripts/ajax-call.js"></script>,但是我遇到了另一个错误:"XMLHttpRequest cannot load http://www.visitsingapore.com/api.listing.en.json. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4400' is therefore not allowed access." 这是什么意思? - Yi Kiat
4
这意味着问题已经得到解决。但是,除了您在问题中描述的问题之外,您还有一个完全不相关的红外问题,在这里已经得到回答。因此,您应该发布一个关于额外的不相关问题的新问题。 - sideshowbarker
@sideshowbarker 添加错误的SHA256哈希值对我有用,谢谢你。 - Rajasekar

-1
在我的情况下,这是由于插件引起的。插件试图在网站上执行某些操作,而网站将其阻止了。 问题出在BlazeMeter的Chrome插件上。
所以只需移除插件然后再试一次。 或者 尝试使用另一个浏览器。

这并没有真正回答问题。如果你有其他问题,可以点击提问来提出。如果你想在这个问题有新的回答时收到通知,你可以关注此问题。一旦你拥有足够的声望,你还可以添加悬赏以吸引更多关注。- 来自评论 - Ram Chander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接