2013-04-16 2 views
0

마크 다운을 메시지 본문으로 입력 할 수있는 양식이 있다고 가정 해 보겠습니다. 텍스트는 다른 페이지로 HTML에서 JSON 렌더링 : XSS 공격은 * 단지 * 페이지 렌더링을 중단시키는 것을 어떻게 막아야합니까?

<html> 
    <body> 
     <script type="text/javascript"> 
     loadMessage({ 
      name: 'John Doe', 
      message: '**Hello** World' 
     }); 
     </script> 
    </body> 
</html> 

loadMessage는 인하 파서 (예컨대 marked)를 사용하고, 실행시에 HTML을 출력 척. </script>는 스크립트 블록을 닫 브라우저를 일으키는 Unexpected token ILLEGAL 예외가 발생

<html> 
    <body> 
     <script type="text/javascript"> 
     loadMessage({ 
      name: 'John Doe', 
      message: '</script>' 
     }); 
     </script> 
    </body> 
</html> 

때문에 :

나는 악의적 인 사용자가 페이지에 오류가 발생할 수있는 경우를 확인했습니다. Marked는 그러한 공격을 삭제할 수 있지만이 공격은 JavaScript 실행 전에도 발생합니다.

  1. 처음 양식을 제출할 때 모두 <script>과을 제거하십시오. 이것은 많은 프레임 워크 코드를 업데이트하는 것을 의미합니다 (ASP.NET MVC를 사용하므로 기본 ModelBinder를 확장해야합니다).
  2. 이것을 위해 JSON 포맷터를 활용하십시오. JSON을 작성할 때 '</' + 'script>'으로 변환하십시오. 우리는 소스를 손상시키지 않을 것입니다.하지만 아마도 은 나쁜 것입니다..

어떻게 이러한 공격을 완화해야합니까?

+0

HTML 엔티티를 벗어나지 마십시오. – Blender

+0

마크 다운 및 마크 다운 [HTML 허용] (http://daringfireball.net/projects/markdown/syntax#html)입니다. 탈출하고 클라이언트에서 벗어날 가치가 있습니까? – TheCloudlessSky

+0

Markdown을 JavaScript에 출력하고 HTML에 직접 출력하지 않는 특별한 이유가 있습니까? – Blender

답변

1

개인적으로 스크립트 태그와 비슷한 것을 제거하는 경우가 있습니다. 이러한 접근 방식은 Markdown 파서의 유효성 검사 버그에 대한 추가 보안 레이어를 제공합니다. 그러나 마일리지는 신청에 따라 다를 수 있습니다.

부호화해야하는 경우 합리적인 인코딩 방법 (즉, \ x3c를 사용하여 소문자 부호를 바꾸려면 https://stackoverflow.com/a/236106/131903 참조)을 참조하십시오. 작동합니다 :

<html> 
    <script> 
    alert("1 \x3c/script> 2"); 
    </script> 
</html> 
+0

양식 게시시 또는 JSON이 렌더링 될 때 값을 제거 하시겠습니까? – TheCloudlessSky

+1

공정한 질문입니다. 입력을 제거하는 것이 더 안전하지만 데이터를 영구적으로 잃게됩니다.그러나 그 방법으로 모든 결과물을 떼어 낼 필요가 없으며 스크립트 태그가 중요한 데이터가 될 가능성이 적기 때문에 더 안전한 경로를 선택하게됩니다 (스트리퍼가 실제로 올바르게 작동하는지 확인하기위한 충분한 단위 테스트를 추가 한 후).). –

+0

예 - 입력을 제거하려고합니다. 건배! – TheCloudlessSky

관련 문제