2009-04-11 1 views
5

커뮤니티 회원이 다른 사람들이 자신의 자바 스크립트 코드를 제공하도록 허용하고 싶습니다. 사용자의 상상력이 내가 생각할 수있는 것보다 훨씬 큽니다.외부 코드를 '안전'으로 실행하려면 어떻게해야합니까? 그냥 eval()을 금지 하시겠습니까?

그러나 이는 특히 내재적 인 보안 문제를 야기합니다. 특히 외부 코드를 실행할 수 있도록 허용해야합니다.

그래서, eval()을 제출하지 못하게 할 수 있습니까? 아니면 자바 스크립트에서 코드를 평가하거나 대량 패닉을 일으키는 다른 방법이 있습니까?

허용하지 않는 다른 사항이 있지만 가장 주요한 관심사는 문자열을 실행하지 못하도록하지 않으면 특정 방법으로 다른 필터를 넣을 때 방해받을 수 있다는 것입니다. 또는 저자가 웹 서비스 인터페이스를 제공하도록 요구해야합니까?

답변

8

를 eval 함수를 대체 할 수 또는이 자바 스크립트가 있기 때문에 당신은 스크립트 구문 분석 수준에서 eval()에 전화를 필터링 할 수 없습니다

코드를 평가하는 다른 방법입니다 호출을 난독화할 수있는 완전한 언어. 예. svinto의 해결 방법을 참조하십시오. 당신은 null 값로 덮어 써서 window.eval을 숨길 수 있지만 (내 머리 위로 떨어져)를 포함하여 코드를 평가하는 다른 방법, 참이 있습니다 :

  • 새로운 기능 ('코드')()
  • document.write를 ('% 3Cscript> 코드 % 3C/script>')
  • document.createElement ("스크립트").에 appendChild (document.createTextNode ("코드"))
  • window.setTimeout ("코드" , 0);
  • window.open (...) 평가 ('코드')
  • 같이 location.href =. '자바 스크립트 : 코드'IE에서
  • , 스타일/node.setExpression ('someproperty', '코드') 일부 브라우저에서는
  • , node.onsomeevent = 'code'; 구형 브라우저 인 Object.prototype에서는
  • 입니다.eval ('code')

또는 자바 스크립트로 대량 패닉이 발생합니다.

음의 createElement ('iframe이') SRC =. 'HTTP : //evil.iframeexploitz.ru/aff=2345'정말 당신이 기대할 수있는 더 공격 중 하나 ...하지만입니다 때 스크립트 제어권을 가졌으므로 사용자가 사이트에서 할 수있는 모든 것을 할 수 있습니다. 포럼에 수천 번 "나는 아주 오래되어서 소아 성애 환자입니다!"라고 게시하고 자신의 계정을 삭제할 수 있습니다. 예를 들어.

저자가 웹 서비스 인터페이스를 제공하도록 요구해야합니까?

예, 또는 :

  • 아무것도 할 수 있으며이 기능을 다운로드 Greasemonkey와를 원하는 사용자는
  • 수의사 모든 스크립트 제출 자신에게
  • 자신의 (잠재적으로 자바 스크립트와 같은) 미니 언어를 사용하자 위에 실제로 당신이 제어 할 수

당신이 관심을 가질 수있는 후자의 예는입니다. 나는 그것을 믿을 수 있을지 잘 모르겠다. 힘든 일이고 지금까지 보안상의 문제가 있었지만, 실제로이 접근법을 취해야한다면 최선의 방법이 있습니다.

5

실제로 임의의 Javascript 실행을 허용하는 것이 안전 할 수는 없습니다. 현실적으로 악의적 인 코드를 막기 위해 제공하는 모든 유형의 필터링은 유사한 기능이나 데이터에 액세스하는 합법적 인 코드를 제거합니다. 나는 당신이하려는 일이 이런 식으로 실현 가능하다고 생각하지 않습니다.

+1

무제한적인 권한을 가진 언어를 가져 와서 더 안전하게하기 위해 보안 작업을해온 긴 역사가 있습니다. 위에서 언급 한 Joe-E 언어와 Caja 언어를 참조하십시오. –

1

아니요, 실제로 사용자가 제공하는 자바 스크립트 코드가 원하는대로 실행되는 것을 막을 수는 없습니다. 허용하지 않는 경우에도 eval()은 임의의 프로그램을 실행하지 못하도록 차단할 수 없습니다 (자바 스크립트 인터프리터 자체 일 수 있음). eval() 함수 및 다른 많은 방법 - 예를 들어, 문자열 형식의 일부 이벤트 처리기와 함께 HTML을 추가 한 다음 실행할 수 있습니다. document.write() 새 스크립트 등).

사이트에서이 사용자가 제공 한 JS가 다른 사용자의 컴퓨터에서 실행될 필요가 없다면, 나는 큰 뚱뚱한 경고를하고 일부 사람 컨트롤 (악성 코드를 그런 식으로 표시 할 수 있음)을 추가하고, 일부 바이러스 백신 서버의 소프트웨어 (그것에 대해 많이 알지는 못한다).

+0

경고는 사용자가 충분한 정보를 바탕으로 결정을 내리는 데 도움이되지 않습니다. 그들은 돈을 버는거야. –

0

아마도 필터링 평가가 작동하지 않을 수 있습니다. 나는 당신이 이것을 해킹 할 수 있다고 상상한다 : window['ev' + 'al']('alert("hello world");');. 당신은 물론 ...

9

HTML5이 사용 가능하게되었으므로 sandbox을 신뢰할 수없는 JavaScript 코드로 사용할 수 있습니다. Sandboxed frames

OWASP HTML5 Security Cheat Sheet 코멘트 :

  • 는 신뢰할 수없는 콘텐츠에 대한 iframe 대응의 샌드 박스 속성을 사용합니다.
  • iframe의 sandbox 속성은 iframe 내의 콘텐츠에 대한 제한을 허용합니다. sandbox 속성이 설정되면 다음 제한 사항이 적용됩니다.

    1. 모든 마크 업은 고유 한 출처로 취급됩니다.

    2. 모든 양식 및 스크립트는 사용할 수 없습니다.

    3. 모든 링크가 다른 인터넷 사용 환경을 타겟팅하지 못합니다.
    4. 자동으로 트리거되는 모든 기능이 차단됩니다.
    5. 모든 플러그인을 사용할 수 없습니다.

      sandbox 속성의 값을 사용하여 iframe 기능을 세부적으로 제어 할 수 있습니다.

  • 이 기능이 지원되지 않는 이전 버전의 사용자 에이전트에서는이 속성이 무시됩니다. 이 기능을 추가 보호 레이어로 사용하거나 브라우저에서 샌드 박스 프레임을 지원하는지 확인하고 지원되는 경우 신뢰할 수없는 콘텐츠 만 표시하는지 확인하십시오.이 속성에서 별도로

  • 는 클릭 재킹 공격과 denysame-origin 값을 지원 헤더 X-Frame-Options을 사용하는 것이 권장된다 원치 않는 프레임을 방지합니다. 프레임 덤프와 같은 다른 솔루션 인 if(window!== window.top) { window.top.location = location; }은 권장하지 않습니다.

당신은 장소에 다른 제한을 유지하면서 스크립트의 실행을 허용 할 수 있습니다. 그러나 공격자가 사용자의 페이지를 직접로드하도록 (즉, IFrame을 통하지 않고) 사용자의 XSS 공격을 방지하기 위해 스크립트가 기본 콘텐츠와 다른 도메인에서 실행되는지 확인해야합니다.

이렇게하면 스크립트가 eval을 사용하여 기본 도메인을 공격하는 것을 제한하지만 실제로 스크립트가 실제로 필요한만큼 강력하지 않을 수도 있습니다. 기본 도메인과의 상호 작용은 Window.postMessage을 통해 이루어져야합니다. 너무 제한적인 경우 @bobince's answer에는 여전히 해결 방법에 대한 최상의 제안이 있습니다.

샌드 박스를 안전하게 구현하는 방법에 대한 자세한 내용은 my other answer을 참조하십시오.

0

샌드 박스 환경에서 신뢰할 수없는 코드를 실행해야합니다. 즉, sandbox 속성을 가진 iframe을 생성하고 (이 코드를 별도의 스레드에서 실행하고 사용자가 이상한 것을 제출 한 경우 UI를 중단하지 않도록) 해당 프레임 내부에 웹 작업자를 추가로 생성하는 것을 의미합니다. .

설명 된 방식으로 샌드 박싱 된 코드로 어떻게 든 상호 작용해야하는 경우 messaging mechanism을 사용할 수 있습니다. 다소 까다 롭지 만, 나 자신이 만든 라이브러리를 포함하여 작업을 단순화하는 라이브러리가 있습니다. https://github.com/asvd/jailed

관련 문제