eval函數是JavaScript中非常強大的函數之一。它可以接受不同形式的參數,其中包括一個JavaScript代碼的字符串,會將這段字符串當作JavaScript代碼來執行,并且將返回值賦給整個eval語句。
var a = 10; eval("a = 20;"); console.log(a); // 輸出20
然而,在使用eval處理JSON字符串時,可能會帶來安全性問題。因為JSON字符串本身不是JavaScript代碼,但通過eval的操作,就可以將JSON字符串解析為JavaScript對象,并執行其中包含的代碼。這個問題成為了“eval json注入”。
var str = '{"name":"Tom", "age":20, "gender":"male", "__proto__": { "isAdmin": true }}'; var person = eval('(' + str + ')'); console.log(person.name); console.log(person.age); console.log(person.gender); console.log(person.isAdmin); // 輸出true
如上述代碼,如果JSON字符串中含有非法JavaScript代碼,那么eval函數就會將其執行,從而產生安全風險,比如在JSON字符串中添加 "__proto__" 屬性,將會污染整個原型鏈。
因此,在代碼中盡量避免使用eval函數,可以選擇使用JSON.parse()函數來代替eval函數進行JSON字符串解析。JSON.parse()函數只會將JSON字符串解析成JavaScript對象,并不會執行其中嵌入的代碼,從而避免了安全風險。
var str = '{"name":"Tom", "age":20, "gender":"male", "__proto__": { "isAdmin": true }}'; var person = JSON.parse(str); console.log(person.name); console.log(person.age); console.log(person.gender); console.log(person.isAdmin); // 報錯:Uncaught TypeError: person.isAdmin is not a function
以上代碼中,使用JSON.parse()函數解析JSON字符串,當訪問person.isAdmin屬性時,會報錯,證明其并不會污染整個原型鏈。
上一篇b站 json格式