My Spider Sense ostrzega mnie, że używanie eval()
do analizowania przychodzącego JSON jest złym pomysłem. Zastanawiam się tylko, czy JSON.parse()
- który, jak zakładam, jest częścią JavaScript, a nie funkcją specyficzną dla przeglądarki - jest bezpieczniejszy.
javascript
json
Kevin Major
źródło
źródło
JSON.parse
jest szybszy niżeval
, przynajmniej w V8 (silnik JS Chromium). Źródło .Odpowiedzi:
Jesteś bardziej podatny na ataki, jeśli używasz
eval
: JSON jest podzbiorem Javascript, a json.parse po prostu analizuje JSONeval
, pozostawiając otwarte drzwi dla wszystkich wyrażeń JS.źródło
eval('alert(1)');
.Wszystkie
JSON.parse
implementacje najprawdopodobniej używająeval()
JSON.parse
opiera się na rozwiązaniu Douglasa Crockforda , które jest używaneeval()
na linii 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 + ')');
Zaletą
JSON.parse
jest to, że sprawdza, czy argumentem jest poprawna składnia JSON.źródło
JSON.parse()
w Firefoksie 28 i Chromium 33 na moim systemie Linux Mint. Był 2x szybszy niżeval()
w Firefoksie i 4x szybszy w Chromium. Nie jestem pewien, jaki kod źródłowy publikujesz, ale w moich przeglądarkach to nie to samo.JSON.parse()
implementację, która jest bezpieczniejsza i szybsza niżeval()
parsery oparte na technologii.Nie wszystkie przeglądarki mają natywną obsługę formatu JSON, więc będą chwile, w których trzeba będzie użyć
eval()
ciągu JSON. Użyj parsera JSON ze strony http://json.org, ponieważ obsługuje on wszystko o wiele łatwiej.Eval()
jest złem, ale w stosunku do niektórych przeglądarek jest złem koniecznym, ale jeśli możesz tego uniknąć, zrób to !!!!!źródło
Istnieje różnica między tym, co zaakceptuje JSON.parse () i eval (). Wypróbuj eval na tym:
var x = "{\" nazwa_koszyka_zakupowego \ ": \" koszyk_zakupowy: 2000 \ "}"
eval(x) //won't work JSON.parse(x) //does work
Zobacz ten przykład .
źródło
Jeśli przeanalizujesz JSON z
eval
, pozwalasz, aby przetwarzany ciąg zawierał absolutnie wszystko, więc zamiast być tylko zbiorem danych, możesz znaleźć wykonywanie wywołań funkcji lub cokolwiek innego.Ponadto JSON
parse
akceptuje dodatkowy parametr, reviver, który pozwala określić, jak postępować z określonymi wartościami, takimi jak daty (więcej informacji i przykład w dokumentacji wbudowanej tutaj )źródło
JSON to tylko podzbiór JavaScript. Ale
eval
ocenia pełny język JavaScript, a nie tylko podzbiór, którym jest JSON.źródło
JSON.parse
(bezpośrednio zaimplementowany w silniku JavaScript) analizuje tylko JSON. Ale inne implementacje nienatywne używają pewnych sprawdzeń poprawności, a następnie używają icheval
ze względu na wydajność.