Eval은 사악합니다… 그렇다면 대신 무엇을 사용해야 할까요?

StackOverflow https://stackoverflow.com/questions/646597

  •  22-07-2019
  •  | 
  •  

문제

Ajax 요청은 사용자 입력으로 채워진 표준 JSON 배열을 반환합니다.입력이 삭제되었으며 eval() 함수를 사용하면 쉽게 자바스크립트 객체를 생성하고 페이지를 업데이트할 수 있습니다.

그래서 여기에 문제가 있습니다.입력을 아무리 열심히 삭제하려고 해도 eval() 함수를 사용하지 않는 편이 낫습니다.저는 "평가 없이 AJAX에서 JSON"을 사용하는 방법을 Google에서 확인했고 다양한 방법을 실행해 보았습니다.

어느 것을 사용해야 합니까?이를 수행하는 표준적이고 입증된 보안 방법이 있습니까?

도움이 되었습니까?

해결책

json.org는 좋은 것을 가지고 있습니다 JavaScript 라이브러리

간단한 사용 :

JSON.parse('[{"some":"json"}]');
JSON.stringify([{some:'json'}]);

편집하다: 주석에서 지적한 바와 같이, 이것은 소스를 살펴 보면 평가를 사용합니다 (먼저 소독 될 것 같지만).

완전히 피하려면보십시오 JSON_PARSE 또는 JSON-SANS-EVAL

json2.js는 안전하지 않습니다.

다른 팁

이 작업을 수행하는 표준적이고 입증 된 방법이 있습니까?

다가오는 ECMAScript 3.1 버전의 JavaScript에서 제안 된 표준 방법이 있습니다. json.parse.

IE8, Firefox 3.1/3.5 및 미래의 다른 인기있는 브라우저에서 지원됩니다. 그 동안, 당신은 at evay ()로 돌아 가거나 독점적으로 사용할 수 있습니다. 악은 그렇지 않을 수도 있고 아닐 수도 있습니다. 확실히 JSON.PARSE보다 느리게 될 것입니다. 그러나 이것이 오늘날 JSON을 구문 분석하는 일반적인 방법입니다.

공격자가 JSON을 통해 뱉어내는 콘텐츠에 Malsious JavaScript를 주입 할 수 있다면 Eval-IS-Evil보다 걱정할 큰 문제가 있습니다.

입력이 소독되면 평가가 가장 좋은 방법입니다. 서버가 손상되면 사람들은 원하는 스크립트를 클라이언트에게 보낼 수 있습니다. 따라서 평가를하는 것은 큰 보안 위험이 아닙니다. 사람들이 클라이언트에 도달하기 전에 패킷을 조작하는 사람들이 걱정된다면, 다시 스크립트 자체를 수정할 수 있습니다.

평가에 대해 걱정하지 마십시오. 그러나 JSON이 엉망이되면 사용자가 JS 오류를 얻지 못하도록 시도한 시도로 마무리하십시오.

:)

JSON을 JS 객체로 안전하게 변환하려면 JSON.PARSE () 기능과 같은 JSON 파서를 사용해야합니다. 이 도서관.

명령 디자인 패턴과 비교합니다. http://en.wikipedia.org/wiki/command_pattern. 이를 감안할 때 클라이언트가 실행할 수있는 작업을 정확하게 정의 할 수 있으며 응용 프로그램은 기본 해석만큼 안전합니다.

위생으로 달성하려는 것에 달려 있습니다. 나는 큰 성공을 거두었습니다 원기 JSON 및 안전한 평가에 대한 프레임 워크의 지원.

주사 위험이 없다고 확신한다면 eval()ing 루프에서 사용하십시오 eval(). 확실히 느리게 진행되고 휴식이 발생할 수 있으며 클라이언트가 추가 코드를 다운로드 해야하는 다른 옵션과 호의적으로 비교됩니다.

jQuery에서 "도난"

// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
    window.JSON.parse( data ) :
    (new Function("return " + data))();

문제:eval이 제기하는 문제는 전역 범위에서 실행된다는 것입니다.

eval.call(document, "console.log(this)")
eval.call(navigator, "console.log(this)")
eval.call(window, "console.log(this)")
(function(){eval.call(document, "console.log(this)")})()
>Window

대본:

속성과 같은 다양한 문서 요소의 마크업 코드에서 개별 속성을 사용한다고 가정합니다. 눈에 보이지 않는

<img src="" onvisible="src='http://www.example.com/myimg.png';">

이 속성이 있는 모든 요소를 ​​가져오려면 onvisible-content-string을 클로저로 바꾸고 이를 EventHandler 대기열에 넣으세요.JS 함수 생성자가 작동하는 곳입니다.

Function === 0..constructor.constructor
>true

Function('return [this, arguments]').call(window, 1,2,3)
>Window, Arguments[3]]
Function('return [this, arguments]').call(document, 1,2,3)
>Document, Arguments[3]]
Function('return [this, arguments]').call(navigator, 1,2,3)
>Navigator, Arguments[3]]    

함께 모아서:

var eventQueue = [];
var els = document.querySelectorAll('[onvisible]');

for (var el in els) {
    var jscode = els[el].getAttribute('onvisible');
    eventQueue.push( {el:els[el], cb:Function(jscode)} )
}

//eventQueue[0].cb.call(scope, args);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top