programing

평가는 사악합니다...그럼 무엇을 대신 사용해야 할까요?

telecom 2023. 9. 2. 07:58
반응형

평가는 사악합니다...그럼 무엇을 대신 사용해야 할까요?

Ajax 요청은 사용자 입력으로 채워진 표준 JSON 배열을 반환합니다.입력 내용이 삭제되었으며, eval() 기능을 사용하여 쉽게 Javascript 개체를 생성하고 페이지를 업데이트할 수 있습니다.

그래서 여기 문제가 있습니다.아무리 입력을 sanitize하려고 해도 eval() 기능은 사용하지 않는 것이 좋습니다.구글에서 "JSON in AJAX without eval"을 사용하는 방법을 확인하고 여러 가지 방법을 우연히 발견했습니다.

어떤 것을 사용해야 합니까?이를 위한 표준적이고 입증된 안전한 방법이 있습니까?

json.org 에는 멋진 자바스크립트 라이브러리가 있습니다.

단순 사용:

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

편집: 댓글에서 지적한 것처럼 출처를 훑어보면 eval을 사용합니다(비록 먼저 소독된 것처럼 보이지만)

완전히 피하려면 json_val 또는 json-val을 확인합니다.

json2.js는 안전하지 않습니다. json_sys.js는 느리고 json-session-eval.js는 가속되지 않습니다.

이를 위한 표준적이고 입증된 안전한 방법이 있습니까?

이를 위해 제안된 표준 방법은 다음 버전의 JavaScript 3.1 버전인 JSON.parse에 있습니다.

IE8, Firefox 3.1/3.5 및 향후 다른 인기 브라우저에서 지원될 것입니다.그 동안 eval()로 돌아가거나 독점적으로 사용할 수 있습니다.악할 수도 있고 아닐 수도 있습니다. 확실히 JSON.parse보다 느릴 것입니다.하지만 그것이 오늘날 JSON을 분석하는 일반적인 방법입니다.

공격자가 JSON을 통해 뱉는 콘텐츠에 악의적인 JavaScript를 주입할 수 있다면 eval-is-evil보다 걱정해야 할 더 큰 문제가 있습니다.

일단 입력 내용이 삭제되면 eval이 최선의 방법이라고 생각합니다.서버가 손상된 경우, 사용자는 원하는 스크립트를 클라이언트로 전송할 수 있습니다.따라서 평가를 하는 것은 큰 보안 위험이 아닙니다.사람들이 클라이언트에 도달하기 전에 패킷을 조작하는 것이 걱정되는 경우에도 스크립트 자체를 수정할 수 있습니다.

평가에 대해서는 걱정하지 마세요.하지만 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.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 생성자가 작동합니다.

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);

언급URL : https://stackoverflow.com/questions/646597/eval-is-evil-so-what-should-i-use-instead

반응형