eval()
또는 문자열에서 생성 된 함수를 사용하지 마십시오. 하지만 사용자가 입력 할 수있는 자바 스크립트의 하위 집합을 실행할 필요가있을 때 나는 lexer/파서와 인터프리터를 작성하는 데 많은 시간을 절약 할 수 있기 때문에 그것을 사용하도록 유혹 당한다. 기본 접근 방식은이 같은 eval()
로를 통과하는 것중요한 리터럴을 "with (...) {...}"에서 샌드 박스 코드로 선언하는 것이 안전합니까?
a.toLowerCase() === 'xyz' || b == 1 || /pqr/.test(c)
:
나는이 코드를 실행하고 싶은 말with({a: ..., b: ..., c: ...}) {
ret = eval(code);
}
나는 code
항상 무 비판적 포함되어 있는지 확신 할 수 없다 위와 같은 코드. 이로 인해 악성 코드가 실행될 수 있습니다. 객체/메소드 with
액세스 내에서 코드를 실행하는
var obj = {
// list incomplete ;)
console: true, XMLHttpRequest: true, document: true, window: true, addEventListener: true, removeEventListener: true, parent: true, top: true, history: true, ...,
// actual data
a: ..., b: ..., c: ...
};
with (obj) {
...
}
possibe되어 있지 않은 경우 :
내가 객체를 다시 정의하는 중요한 브라우저를 통과하는 생각 같은 실제 데이터 이외의with
에 객체.
다시 정의되지 않은 다른 개체/함수를 통해 간접적으로 액세스되는 경우에도 이러한 메서드에 간접적으로 액세스 할 수 있음을 알고 있습니다. 이것들을 다시 정의한다고 가정 해 봅시다.
샌드 박스 코드에 보안 성이 있습니까 객체 및 기능이 콘텐츠 객체 인이 충분합니까?
이 경우 공격 벡터는 어떻게 남을 수 있습니까?
편집 1 :
코드는 파이어 폭스, 크롬, IE에서 실행해야합니다 (10 +), 오페라, 사파리.
어디에서 실행되고 있습니까? 사용자의 브라우저에서? NodeJS에? NodeJS 또는 최신 브라우저에서는 엄격 모드가있는 IIFE를 사용하면 더 나은 행운을 얻게됩니다. –
모든 사용자가 자신의 브라우저에서 자체 코드를 실행하도록하십시오. 아무것도 잘못 될 수는 없습니다. – Bergi
[샌드 박스 코드를위한 가능한 해결책 (this link)] (http://stackoverflow.com/a/21700111/413180). – SilverlightFox