My Spider Sense попереджає мене, що використання eval()синтаксичного аналізу вхідних файлів JSON - погана ідея. Мені просто цікаво, чи JSON.parse()є, як я вважаю, частиною JavaScript, а не функцією браузера, більш безпечним.
My Spider Sense попереджає мене, що використання eval()синтаксичного аналізу вхідних файлів JSON - погана ідея. Мені просто цікаво, чи JSON.parse()є, як я вважаю, частиною JavaScript, а не функцією браузера, більш безпечним.
Відповіді:
Ви більш уразливі для атак при використанні eval: JSON є підмножиною Javascript і JSON.parse просто розбирає JSON , тоді evalб залишити відчинені двері всіх виразів JS.
eval('alert(1)');.
Усі JSON.parseреалізації, швидше за все, використовуютьeval()
JSON.parseбазується на рішенні Дугласа Крокфорда , який використовує eval()саме там, на рядку 497 .
// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.
j = eval('(' + text + ')');
Перевага в JSON.parseтому, що він перевіряє, чи аргумент правильний синтаксис JSON.
JSON.parse()у Firefox 28 та Chromium 33 у своїй системі Linux Mint. Це було вдвічі швидше, ніж eval()у Firefox, і в чотири рази швидше в Chromium. Я не впевнений, який вихідний код ви публікуєте, але це не одне і те ж у моїх браузерах.
JSON.parse()реалізацію, яка є безпечнішою та швидшою, ніж eval()парсери на базі.
Не всі браузери мають власну підтримку JSON, тому іноді вам потрібно буде використовувати eval() рядок JSON. Використовуйте синтаксичний аналізатор JSON з http://json.org, оскільки це набагато простіше для вас.
Eval() є злом, але проти деяких браузерів є необхідним злом, але там, де ви можете цього уникнути, зробіть це !!!!!
Існує різниця між тим, що прийматимуть JSON.parse () та eval (). Спробуйте оцінити на цьому:
var x = "{\" shoppingCartName \ ": \" shopping_cart: 2000 \ "}"
eval(x) //won't work
JSON.parse(x) //does work
Дивіться цей приклад .
Якщо ви аналізуєте JSON за допомогою eval, ви дозволяєте рівню, який аналізується, містити абсолютно будь-що, тож замість того, щоб бути лише набором даних, ви можете виконати виклики функцій або що завгодно.
Крім того, JSON parseприймає додатковий параметр, відновлення, який дозволяє вказати, як поводитися з певними значеннями, такими як дати (більше інформації та приклад у вбудованій документації тут )
JSON - це лише підмножина JavaScript. Але evalоцінює повну мову JavaScript, а не тільки підмножину, яка є JSON.
JSON.parse(безпосередньо реалізована в движку JavaScript) аналізує лише JSON. Але інші реалізації, що не є місцевими, виконують певну перевірку розумності, а потім використовують evalз міркувань продуктивності.
JSON.parseце швидше, ніжeval, принаймні, у V8 (двигун JS від Chromium). Джерело .