내 Spider Sense는 eval()
들어오는 JSON을 구문 분석 하는 데 사용 하는 것은 나쁜 생각 이라고 경고합니다 . 나는 JSON.parse()
브라우저 특정 기능이 아닌 JavaScript의 일부라고 가정하는 것이 더 안전 한지 궁금합니다 .
답변:
다음을 사용하는 경우 공격에 더 취약합니다eval
. JSON은 Javascript의 하위 집합이고 json.parse는 JSON을 구문 분석하는 반면 eval
모든 JS 표현식에 대한 문을 열어 둡니다.
eval('alert(1)');
.
JSON.parse
사용 가능성이 가장 높은 모든 구현eval()
JSON.parse
Douglas Crockford의 솔루션을 기반으로 합니다. 497 번 라인에서eval()
바로 사용합니다 .
// 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()
Linux Mint 시스템에서 Firefox 28 및 Chromium 33에서 테스트 했습니다. eval()
Firefox 보다 2 배 빠르며 Chromium에서 4 배 빠릅니다. 어떤 소스 코드를 게시하고 있는지 잘 모르겠지만 내 브라우저에서는 동일하지 않습니다.
모든 브라우저가 기본 JSON을 지원하는 것은 아니므로 eval()
JSON 문자열 을 사용해야 하는 경우 가 있습니다 . http://json.org의 JSON 파서를 사용하면 모든 것을 훨씬 쉽게 처리 할 수 있습니다.
Eval()
악하지만 일부 브라우저에 대해서는 필요한 악이지만 피할 수있는 곳에서는 그렇게 !!!!!
JSON.parse ()와 eval ()이 받아들이는 것에는 차이가 있습니다. 이것에 대해 평가 해보십시오.
var x = "{\"shoppingCartName \ ": \"shopping_cart : 2000 \ "}"
eval(x) //won't work
JSON.parse(x) //does work
이 예를 참조하십시오 .
JSON은 JavaScript의 일부일뿐입니다. 그러나 eval
JSON 인 부분 집합 만이 아니라 전체 JavaScript 언어를 평가합니다.
JSON.parse
(JavaScript 엔진에 직접 구현 된) JSON 만 구문 분석합니다. 그러나 기본이 아닌 다른 구현에서는 온 전성 검사를 수행 한 다음 eval
성능상의 이유로 사용 합니다.
JSON.parse
보다 빠릅니다eval
. 소스 .