My Spider Sense는 들어오는 JSON을 구문 분석 할 때 eval()
을 사용하는 것이 좋지 않다는 경고를받습니다. 그냥 JSON.parse()
- 브라우저의 특정 기능이 아닌 JavaScript의 일부라고 생각하면 더 안전합니다.JSON.parse vs. eval()
답변
당신은 더 취약 등 (인라인 문서 here에 대한 추가 정보를 원하시면 예) 날짜 시간 등의 특정 값을 처리하는 방법을 지정할 수 있도록하는이 추가적으로 매개 변수, 자극성을 받아 공격을 사용하는 경우 eval
: JSON은 Javascript의 하위 집합이며 json.parse는 JSON을 구문 분석하지만 eval
은 모든 JS 표현식에 대해 문을 열어 둡니다.
JSON은 자바 스크립트의 일부입니다. 그러나 eval
은 JSON 인 서브셋이 아닌 전체 자바 스크립트 언어를 평가합니다.
맞아요, 저도 압니다. JSON.parse()가 JSON 만 평가하고 다른 모든 들어오는 데이터는 실패 함을 의미합니까? 또는 단순히 래퍼입니다 : var myObject = eval ('('+ 'responseText +') '); ?? –
@Kevin Major : 네, 기본적으로 구현 된 JSON.parse (자바 스크립트 엔진에 직접 구현)는 JSON 만 구문 분석합니다. 그러나 다른 비 고유 구현은 성능상의 이유로 일부 정상 검사를 사용하고 'eval'을 사용합니다. – Gumbo
eval
으로 JSON을 구문 분석하면 구문 분석중인 문자열에 절대적으로 아무 것도 포함 할 수 없으므로 데이터 집합이 아니라 함수 호출 등을 수행 할 수 있습니다. 또한
parse
당신이
모든 브라우저가 기본 JSON을 지원하지는 않으므로 eval()
을 JSON 문자열에 사용해야하는 경우가 있습니다. http://json.org의 JSON 파서를 사용하면 모든 것을 훨씬 쉽게 처리 할 수 있습니다.
Eval()
은 악이지만 일부 브라우저는 악의를 품지 만 피할 수있는 곳은 없으므로 !!!!!
모든 JSON.parse
구현은 대부분 eval()
JSON.parse
이 line 497에 바로 eval()
를 사용 Douglas Crockford's solution, 기반으로 사용합니다.
// 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()와 eval()이 수용하는 것의 차이가 있습니다. "{shoppingCartName \"\ "shopping_cart : 2000 \
VAR X =을 \": "}"이에 대한 평가 시도
eval(x) //won't work
JSON.parse(x) //does work
이 example를 참조하십시오.
eval은 문자열을 코드 문으로 구문 분석하므로 값 선언 식 대신 코드 식으로 "{...}"을 고려하므로 eval이 작동하지 않습니다. 모호성 (예 : "[{....}")을 제거하면 식의 특성에 의심의 여지가 없으며 eval은 구문 분석 된 objet –
예를 포함하는 배열을 만듭니다. 전통적으로, x는 괄호로 둘러 쌉니다 : eval ("("+ x + ")"). 내가 말한 것은 아직 남아 있습니다 : JSON.parse()를 사용할 때 애매 모호하지 않습니다. –
- 1. Eval() vs. Expression Tree
- 2. MongoDB의 모든 JSON.parse 빌드?
- 3. 자바 스크립트 분할 및 JSON.parse
- 4. JSON.parse : 코드에 대한 데이터 오류
- 5. JSON.parse()에 큰 따옴표가 필요합니까?
- 6. eval() - eval() 'd 코드의 구문 분석 오류
- 7. JSON.parse ('{ "key": "value"}')는 정상적으로 작동하지만 JSON.parse ('{key : "value"}')는 그렇지 않은 이유는 무엇입니까? 노드 REPL에서
- 8. Java 6 ScriptEngine 및 JSON.parse 문제
- 9. JSON.parse, JS의 타입 캐스팅 및 revivers
- 10. 이 JSON.parse 코드가 작동하지 않는 이유는 무엇입니까?
- 11. Ruby에서 JSON.parse 응답의 필터링 (및 JSON gem)
- 12. JavaScript 클로저 - Eval() 및 Eval()의 범위에서 변수 캡처
- 13. EVAL IN C# asp.net
- 14. `eval` 호출 시간 초과
- 15. IE에서 eval 문제
- 16. M4 eval precision
- 17. php eval 함수
- 18. Groovy에서 eval()과 같습니다.
- 19. Objective-C 코드의 "eval"
- 20. Bool로 Eval ("bitValue") 캐스팅
- 21. eval() - 구문 오류
- 22. 리스트를 eval()에 건네겠습니다
- 23. ASP : LinkButton 및 Eval
- 24. 범위에있는 객체의 변수가있는 eval()
- 25. 'eval() uating'조건 대신
- 26. asp Eval 함수
- 27. NavigateUrl 및 EVAL
- 28. Perl에서이 eval 문이 잘못되었습니다.
- 29. Python : eval safe
- 30. 여기서 eval()을 사용해야합니까?
* "공격에 더 취약합니다"*, 완전히 동의하지 않습니다! – Hydro
죄송합니다, Matheus, 동의해야합니다. 문제는 eval()을 사용하여 JavaScript에서 외부 소스 인 "사용자 입력"을 해석 할 때 (호출 한 서블릿 또는 다른 웹 서비스의 반환 값 포함)입니다.사용자가 클라이언트 응용 프로그램에 직접 악의적 인 JavaScript를 입력하지 않았거나 서버 데이터베이스에 저장된 유효성이 확인되지 않은 데이터로 인해 간접적으로 AJAX 스타일의 호출을 통해 프로그램에 전달 된 경우에도 악의적 인 JavaScript가 입력되지 않았 음을 보장 할 수 없습니다. "혼란스러운 대리"공격을 피하기 위해 개별 필드의 유효성을 검사해야하지만 JSON.parse를 사용하는 것이 좋은 첫 번째 단계입니다. – JackLThornton
@Hydro 짧은 개념 증명 :'eval ('alert (1)');'을 시도하십시오. –