2 回答

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
所以問(wèn)題是:從數(shù)組中過(guò)濾掉任何不需要的字符串(名稱)是否足夠安全以對(duì)抗 eval 的可利用性?
不,這不安全。事實(shí)上,它基本上沒(méi)有采取任何措施來(lái)保護(hù)您,因?yàn)槟试S的 cookie 名稱仍然完全不受保護(hù)和消毒。您擁有的內(nèi)容可能不安全,因?yàn)閻阂饪蛻舳丝梢栽谠?cookie 中放入他們想要的任何內(nèi)容,而您“希望”他們找不到超出您擁有的字符串分隔符的內(nèi)容。但是,可以通過(guò)終止字符串然后添加函數(shù)調(diào)用來(lái)打破該字符串分隔符。這可能允許攻擊者在您的服務(wù)器上執(zhí)行任意代碼。
您唯一應(yīng)該使用eval()的是來(lái)自您自己的服務(wù)器端代碼的可信字符串或來(lái)自外部的完全凈化的字符串。但是,幾乎總是,您不需要,eval()因?yàn)檫€有另一種更安全的編碼方式。
eval()在這里,您根本不需要使用。您可以為要調(diào)用的合法函數(shù)創(chuàng)建一個(gè)查找表,然后將函數(shù)直接傳遞給它:
try {
res.locals[cookie] = validateCookie[cookie](req.cookies[cookie]);
} catch(e) {
// either invalid cookie or exception in the function
// handle that here
}
當(dāng)然,您的validateCookie[cookie]()函數(shù)還必須進(jìn)行防御性編碼,才能知道它可能會(huì)傳遞任何內(nèi)容。您沒(méi)有向我們展示該函數(shù)的代碼以便能夠?qū)ζ溥M(jìn)行進(jìn)一步評(píng)論。
在本例中,validateCookie是一個(gè)查找表,其中包含有效cookie名稱及其相應(yīng)的函數(shù):
// cookie processing lookup table
const validateCookie = {
cookieName1: validateCookieName1,
cookieName2: validateCookieName2
};
像這樣的查找表通常是您避免嘗試創(chuàng)建函數(shù)名稱和字符串并用于eval()調(diào)用它的方法。這還增加了安全功能,即此代碼無(wú)法調(diào)用查找表中不存在的任何函數(shù)。

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊
不,代碼不安全,不是因?yàn)樗鼪](méi)有清理驗(yàn)證方法的名稱,而是因?yàn)樗跀U(kuò)展字符串模板文字時(shí)將上傳的文本評(píng)估為 JavaScript:
`... ${req.cookies[cookie]} ...`
我剛剛使用精心設(shè)計(jì)的字符串值測(cè)試并注入了代碼req.cookies[cookie]
,我不會(huì)在此處發(fā)布該值。
在不擴(kuò)展數(shù)據(jù)字符串的情況下評(píng)估驗(yàn)證調(diào)用可能會(huì)稍微安全一些,如下所示
`validateCookie${cookie}` + "(req.cookies[cookie])"
這會(huì)將上傳的文本傳遞到驗(yàn)證例程,而無(wú)需將其作為代碼進(jìn)行評(píng)估,但完全避免的安全性eval
保持不變。eval
通過(guò)使用以函數(shù)名稱為關(guān)鍵字的驗(yàn)證函數(shù)對(duì)象值的查找表,可以輕松地避免這種情況。
添加回答
舉報(bào)