欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Uncaught EvalError:Refused to evaluate a string as JavaScript解決

 更新時(shí)間:2023年09月01日 10:23:15   作者:明月幾時(shí)有666  
這篇文章主要為大家介紹了Uncaught EvalError:Refused to evaluate a string as JavaScript解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

問(wèn)題發(fā)生

環(huán)境:操作系統(tǒng)win10,瀏覽器Google Chrome 版本 103.0.5060.134(正式版本) (64 位)

我想要通過(guò)調(diào)用Function構(gòu)造函數(shù),來(lái)創(chuàng)建一個(gè)完成加法功能的函數(shù),代碼如下:

var sum = new Function('a', 'b', 'return a + b');

在瀏覽器控制臺(tái)運(yùn)行,結(jié)果報(bào)錯(cuò)

大概意思是說(shuō):拒絕將字符串評(píng)估(解析)為JavaScript代碼,因?yàn)樵谝韵聝?nèi)容安全策略指令中,'unsafe-eval’不是一個(gè)允許的腳本源:

通過(guò)Function構(gòu)造 函數(shù),創(chuàng)建一個(gè)功能函數(shù),代碼如下:

function defineGetter(prop, data) {
    return Object.defineProperty(this, prop, {
        get: new Function(`return ${JSON.stringify(data)};`)
    });
}

報(bào)如下錯(cuò)誤:

tools.ts:239 Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self' 'unsafe-inline'".

問(wèn)題分析

1. 內(nèi)容安全策略

(Content Security Policy,CSP) 是一個(gè)額外的安全層,用于檢測(cè)并削弱某些特定類(lèi)型的攻擊。

CSP 的主要目標(biāo)是減少跨站腳本(Cross-Site Scripting XSS) 的攻擊 。XSS 攻擊利用了瀏覽器對(duì)于從服務(wù)器所獲取的內(nèi)容的信任。即使有的時(shí)候這些腳本并非來(lái)自于它本該來(lái)的地方,由于瀏覽器信任其內(nèi)容來(lái)源,使得惡意腳本在受害者的瀏覽器中得以運(yùn)行。

2. 配置內(nèi)容安全策略

一個(gè)策略由一系列策略指令所組成,每個(gè)策略指令都描述了一個(gè)特定資源類(lèi)型以及生效范圍(信任的來(lái)源)
<meta> 元素可以用來(lái)配置該策略(Http響應(yīng)頭也可以配置)

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">

content屬性的內(nèi)容格式:多個(gè)資源類(lèi)型用英文分號(hào)分隔,類(lèi)型和來(lái)源、多個(gè)來(lái)源之間用空格分隔,來(lái)源加英文單引號(hào),如下所示

資源類(lèi)型A ‘來(lái)源1’ ‘來(lái)源2’ … ; 資源類(lèi)型A ‘來(lái)源1’ ’來(lái)源2’…

3.內(nèi)容安全策略指令

default-src,當(dāng)沒(méi)有顯示的為資源配置生效范圍,默認(rèn)使用default-src的值作為生效范圍。

例如,沒(méi)有配置script-src,其默認(rèn)值就是self

script-src,表示資源類(lèi)型為腳本文件(以下取值表示不同的來(lái)源)

  • self 表示允許腳本來(lái)源于當(dāng)前網(wǎng)站(當(dāng)前域名,例如:https://www.xxxx.com/,腳本文件路徑的前綴和所在的html文件一致)
  • unsafe-inline 表示允許腳本來(lái)源于<script></script> 標(biāo)簽對(duì)
  • unsafe-eval 表示允許腳本來(lái)源于字符串

還有樣式等各種各樣的資源,在文章不是重點(diǎn),感興趣可以通過(guò)“資源類(lèi)型”查看

The ‘unsafe-eval’ source expression controls several script execution methods that create code from strings. If ‘unsafe-eval’ isn’t specified with the script-src directive, the following methods are blocked and won’t have any effect:【 'unsafe-eval’控制幾個(gè)從字符串創(chuàng)建腳本代碼的方法。如果’unsafe-eval’沒(méi)有在script-src指令中指定,以下方法將被阻塞,并且不會(huì)產(chǎn)生任何影響:】
eval()
Function()
       When passing a string literal like to methods like: window.setTimeout(“alert(“Hello World!”);”, 500);
setTimeout()
setInterval()
window.setImmediate
window.execScript() Non-Standard (IE < 11 only)

解決方法

簡(jiǎn)單來(lái)說(shuō),eval()、Function()等函數(shù)會(huì)從字符串中“解析”腳本代碼,必須在內(nèi)容安全策略中添加信任字符串來(lái)源的腳本的策略指令,該來(lái)源的腳本才可以正常運(yùn)行。

<head>
<meta http-equiv="Content-Security-Policy"
      content="default-src 'self'; script-src 'self' 'unsafe-eval';">
</head>

如果是在開(kāi)發(fā)谷歌插件可以配置manifest.json里的content_security_policy屬性,添加策略的規(guī)則相同。

如果是在使用eval()函數(shù),或者Function()函數(shù),大概率你是隨意打開(kāi)了一個(gè)網(wǎng)頁(yè),F(xiàn)12進(jìn)入了控制臺(tái)。但是,別人的網(wǎng)站為了安全,不允許字符串來(lái)源的腳本。我嘗試修改別人的網(wǎng)頁(yè),在head元素中添加meta元素,配置內(nèi)容安全策略,無(wú)效。這也是可以理解的,如果可以通過(guò)在別人的網(wǎng)頁(yè)中添加meta元素,配置策略,那就可以隨意攻擊別人的網(wǎng)站了。自己創(chuàng)建一個(gè)html網(wǎng)頁(yè),練習(xí)eval()函數(shù)、Function() 函數(shù)的使用。

另外,也許報(bào)錯(cuò)是"because ‘unsafe-inline’ is not an allowed source",那么只需要把unsafe-inline添加到策略指令script-src中即可

以上就是Uncaught EvalError:Refused to evaluate a string as JavaScript解決的詳細(xì)內(nèi)容,更多關(guān)于Uncaught EvalError解決的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論