2009-10-30 1 views
7

학생들에게 JavaScript 프로그래밍에 대해 가르쳐 줄 수있는 빠른 웹 페이지를 작성하려고합니다. 이 페이지에서는 텍스트 상자를 제공하고 JavaScript를 실행하여 직장에서 언어의 동적 인 특성을 볼 수있게하고 싶습니다. 그러나, 나는 사용자 입력에 eval()을 사용하는 것이 대개 정말 나쁜 생각이라는 것을 잘 알고있다. 이와 같은 페이지를 게시하여 어떤 종류의 보안 위험을 감수하고 있습니까? 이러한 위험을 완화하기 위해 어떤 단계를 밟아야합니까?JavaScript에서 사용자 입력을 실행하기 위해 eval()을 사용할 때의 보안 위험

+4

페이지를 로컬로 실행하기 만하면됩니다. 웹에 올릴 이유가 없습니다. –

답변

5

이것은 자체 컴퓨터에서 실행됩니다. 문자열을 저장하고 다른 사람들에게 보내지 않도록하십시오. 또한 URL에 값을 입력하지 마십시오 (전자 메일로 전송할 수 있습니다).

0

그렇다면 사용자가 귀하의 양식에서 실행하고자하는 모든 코드는 귀하의 사이트가 실행중인 도메인의 권한하에 있고 그 아래에 있어야한다는 것입니다.

잠긴 시스템에서 코드를 실행하려고하지만 사이트를 신뢰하면 (예 : 활성 x 컨트롤 등을 실행할 수 있음) 해당 사용자는 스크립트를 신뢰할 수있는 공간으로 평가하기 위해 사이트를 사용하여 올바른 코드를 입력하십시오. 본질적으로이를 수행하면 해당 페이지에서 실행되는 모든 항목이 도메인을 신뢰하는 사람들에게 안전한지 확인한 것입니다. (IE 등에서 신뢰할 수있는 사이트로 생각하십시오.)

2

로컬 "폐기 형"컴퓨터 인 경우 위험이 거의 없습니다. 모든 것이 클라이언트 측에서 실행되기 때문에 JavaScript으로 만 해를 입을 수 있습니다. 최악의 경우 그들은 Ajax 연결을 열 수 있지만, 그럴 경우 Tamper Data 부가 기능이있는 Firefox를 제공하는 것보다 해롭지 않습니다.

간략히 말하자면, 사용하는 컴퓨터를 제외하고는 JavaScript로 자유롭게 통치 할 수있는 위험은 거의 없지만 (성능 측면을 제외하면), 충분히 교활하다면 스스로 할 수있는 것은 아무것도 아닙니다. 나는 그들에게 자신의 컴퓨터에서 실행 시키거나 데모 상자에서 실행하는 것을 권하고 싶습니다. 데모 상자는 언제든지 실행을 계속하기 위해 너무 많은 시간을 허비하게됩니다.

다른 한편으로는 PHP/etc에 대한 평가 액세스 권한을 부여하는 것은 끔찍하고 끔찍한 생각입니다.

8

보안 위험은 사용자의 의견을 받아 사이트의 스크립트 컨텍스트에서 실행하는 것입니다. 어떠한 이유로 든 웹 사이트에서 JavaScript을 수정하기위한 모든 권한을 가진 악의적 인 크래커 였다면 상상해보십시오. 도메인에서 실행되는 자바 스크립트가 할 수있는 기능 (쿠키 도용, XSS, 드라이브 바이 멀웨어 등 포함)을 수행 할 수 있습니다.

위험을 완화하기 위해 실제로 할 수있는 유일한 방법은 사용자가 제공 한 콘텐츠를 평가하지 않는 것입니다. "안전한"입력 만 허용하도록 입력을 살균하려는 시도는 실패 할 운명입니다. 잠재적 인 공격자가 자신의 의도를 위장 할 수있는 해석 된 언어를 가지고 있기 때문에 실제로 무엇을 안전하다고 정의하고 스크립트를 실제로 제한하는 것이 더 어렵습니다.

교육적인 목적을위한 것이면 한 가지 방법은 모든 보안 구멍이 중요하지 않은지 확인하는 것입니다. 잘못된 JavaScript는 서버를 파괴하거나 은행 계좌에서 돈을 훔칠 수 없습니다 (당연히 은행 웹 페이지에 있지 않은 경우). 페이지를 호스팅하는 사이트에서 도용 할만한 쿠키 또는 세션이없고 학생들이 교육용 자료라는 것을 알고 있다면 걱정할 것이 없을 것이라고 생각합니다. 대부분의 공격은 도메인에 저장된 기밀 정보에 액세스하거나 도메인 방문자를기만하여 기밀 정보를 어떻게 든 포기하도록합니다 (phishing 공격 또는 유사). 귀하의 목적을 위해 나는 당신이 괜찮을 거라고 생각합니다 - 단지 "진짜"웹 사이트에서하지 마십시오.

+0

대단한 설명. –

+4

사용자가 개발자 도구를 사용하여 원하는 임의의 코드를 실행할 수 있다고 생각할 때 사용자가 부적절한 점으로 제공하는 임의 코드를 실행할 수 있습니까? –

2

평가 된 코드가 모든 전역 (창) 개체 속성 및 메서드에 액세스하지 못하도록 모든 사용자 입력을 샌드 박싱하는 것이 좋습니다.

+2

이들은 단지 새 환경 인 샌드 박스가 아닙니다. 상위 창은'parent' 또는'top'을 통해 쉽게 액세스 할 수 있으며 객체의 eval 메소드를 사용할 수 있습니다. JavaScript의 실제 JavaScript 샌드 박스 라이브러리는 JSandbox입니다. –

1

정말 여기에 심각한 위험이 없습니다 :

는 다음과 같은 자원을 살펴주십시오. 예를 들어,이 페이지에서 방화범을 치고 콘솔에 입력하십시오 : eval("alert('hello');");, 문제? 그렇지 않아.

데모 목적으로는 별 문제가되지 않습니다.

2

자바 스크립트 샌드 박스 라이브러리를 사용해 볼 수 있습니다. Dean Edward의 솔루션 인 Caja는 코드가 현재 창이나 문서에 액세스하는 것을 제한하지 않습니다. JSandbox 라이브러리는 Web Worker Threads을 사용하여 코드 실행을 완전히 샌드 박싱합니다 (이 때문에 DOM을 사용할 수 없음).하지만이를 지원하는 브라우저에서만 작동합니다.

JSandbox는 비동기이므로 콜백을 사용하도록 선택하면 코드를 변경해야합니다.

관련 문제