2017-10-18 16 views
2

최근에 XSS 문제를 만났습니다. 나는 많은 관련 질문 및 기사를 수색하고 읽었다. 모든 답변은 신뢰할 수없는 데이터가 서버로 전달되는 것을 방지하는 방법에 중점을 둡니다. 프론트 엔드에서는 특수 코드를 이스케이프하는 것이 스크립트 실행을 막는 유일한 방법 인 것처럼 보입니다.붙여 넣기 된 스크립트 삽입을 방지하는 방법

하지만 사용자가 입력 코드에 코드 (예 : <script>alert("hi");</script>)를 입력하면이 코드는 언제 실행됩니까? 그리고 그것을 막을 수있는 방법이 있습니까?

나는 keydownkeyup 이벤트를 경청했지만, 이것은 단지 보통의 입력을 방지 할 수 있습니다, 그것은 사용자 복사 입력에 직접 붙여, 그것은 때 사용자 입력 스크립트의 조각을 내 경고 메시지를 보여주지 노력이 없지만 스크립트는 여전히 실행되었습니다!

$("input").on("keyup", function (e) { 
    var value = $(this).val() || ""; 
    var regex = /<(\/?\w+[^\n>]*\/?)>/ig; 
    if(regex.test(value)){ 
     layer.msg("Invalid characters!"); 
     $(this).val(value.replace(regex, "&lt;$1&gt;")); 
     e.preventDefault(); 
     return false; 
    } 
}); 

입력 값의 스크립트가 브라우저에서 실행되는 이유와 실행 시점을 이해할 수 없습니까? 이 메커니즘을 설명하거나 관련성이있는 기사가 있습니까? 내가 눈치 채지 못했던 것을 얻었습니까? 도움이된다고 생각되는 기사가 있으면 알려 주시기 바랍니다. 감사합니다. .

모든 답변과 의견을 보내 주셔서 감사합니다. 어쩌면 나는 분명히 설명하지 않았을지도 모른다. 나는 을 복사했을 때 <script>alert("hi");</script>을 복사하여 입력 창에 붙여 넣으면 브라우저가 경고 창을 표시하고 "hi"를 보였다.

나는 또한 단지 $("input").val('<script>alert("hi");</script>')를 사용하는 한, 그것은 경고 창에 메시지를 표시하지 않습니다,하지만 난 입력의 focusblur 이벤트를 트리거하는 경우, 너무 경고 창을하라는 메시지가 표시됩니다.

그래서 코드가 실행되는 이유는 무엇입니까?

+3

이 문제를 해결하기 위해 브라우저를 신뢰할 수 없습니다. 자바 스크립트를 단순히 비활성화하면 이미이를 우회합니다. (이것이 옵션이 아니더라도 브라우저없이 사용자 정의 HTTP 호출을 작성하는 것은 그리 어렵지 않습니다.) 이 서버 측을 사용자에게 출력하기 전에 이스케이프 처리해야합니다. – Ivar

+0

"입력 값의 스크립트가 브라우저에 의해 실행되는 이유를 이해하지 못합니다.">> 말할 필요가없는 한 그렇지 않습니다. 아래의 @RichouHunter는 당신이 그것을 말할 때의 예를 보여주었습니다 : 당신이 그 입력 값을 가져 왔을 때 그것을 당신의 서버에 저장하고 (예를 들면 사용자 이름으로) 그 값을 다른 페이지에 표시하십시오. – TKoL

+0

내가 이해하고 있는지 잘 모르겠다. 스크립트는 입력 필드에 입력 할 때 실행되지 않고 클라이언트에 다시 제공 될 때만 실행될 수 있습니다. 그러나 그때까지는 입력이 유효하고 서버 측에서 이스케이프되어야합니다. – Clinton

답변

1

내 사용자 이름이 <script>alert('You got pranked!')</script>이고 응용 프로그램이 XSS로부터 보호받지 못한다고합니다.

등록 할 때 앱에서 내 사용자 이름을 그대로 저장하며 아무 문제가 없습니다.

하지만, 내 프로필 페이지 (또는 내 이름이 표시됩니다 모든 페이지)로 이동, 서버에서 렌더링 된 HTML이 클라이언트 브라우저가 <script> 태그를 볼 것이다

<h1>Profile page</h1> 
<p>User name: <script>alert('You got pranked!')</script></p> 

모양을하고 내부에있는 것을 실행할 것입니다.

HTML 특수 문자를 이스케이프 처리하는 가장 쉬운 해결책은 카운터입니다. 당신이 가지고있는 기술 스택이 무엇이든간에, 당신을 위해 그렇게 할 많은 도구들이 있습니다.

하지만이 도구가 작동하는 방식은 내 사용자 이름을 표시 할 때 &lt;script&gt;alert('You got pranked!')&lt;/script&gt;으로 표시되므로 내 사용자 이름을 표시 할 때 브라우저에 <script> 태그가 표시되지 않습니다.

+0

고마워요! 네가 무슨 말을 하려는지 알 겠어. 어쩌면 나는 분명히 설명하지 않았을지도 모른다. 나는 ''을 복사하여 입력에 붙여 넣을 때 브라우저가 경고 창을 표시하는지 테스트했습니다. 그리고 제 질문은 이것이 일어나는 것을 막을 수 있습니까? – Moicen

+0

@Moicen 이는 서버 측에서 사용하는 기술에 따라 다릅니다. (PHP? ASP.NET? JSP? NodeJS?) 질문을 편집하고 (https://stackoverflow.com/posts/46805128/edit)이 정보를 추가하십시오. 스택 오버플로에 대한 설명이 이미 게시되어 있습니다. – Ivar

+0

@Ivar 감사합니다. 질문을 업데이트했습니다. 여기서는 NodeJS를 사용하고 있지만이 경우에는 브라우저와 서버 사이에 통신이 없습니다. – Moicen

2

값 또는 양식 필드의 내용은 브라우저에서 실행되지 있습니다 않으며, 당신은 HTML로 처리하지 않는 한 그들이 HTML 로 분석된다.

입력란에 원하는 것을 붙여넣고 서버에 제출할 수 있습니다. <script>alert("hi");</script>을 입력에 붙여 넣는 것은 문제가 없으며 양식 데이터가 서버에 제출 될 때 해당 텍스트가 입력 필드의 값으로 사용됩니다.

XSS 문제는

HTML 같이 입력 필드의 처리의 예 (RichouHunter's answer에서 설명) 사이트 이전가 가지 않고 응답의 HTML로 데이터 및 분출을 제출 용도 때 온다 서버 :

// Assuming jQuery: 
$('div').html($('input').val());