최근에 XSS 문제를 만났습니다. 나는 많은 관련 질문 및 기사를 수색하고 읽었다. 모든 답변은 신뢰할 수없는 데이터가 서버로 전달되는 것을 방지하는 방법에 중점을 둡니다. 프론트 엔드에서는 특수 코드를 이스케이프하는 것이 스크립트 실행을 막는 유일한 방법 인 것처럼 보입니다.붙여 넣기 된 스크립트 삽입을 방지하는 방법
하지만 사용자가 입력 코드에 코드 (예 : <script>alert("hi");</script>
)를 입력하면이 코드는 언제 실행됩니까? 그리고 그것을 막을 수있는 방법이 있습니까?
나는 keydown
keyup
이벤트를 경청했지만, 이것은 단지 보통의 입력을 방지 할 수 있습니다, 그것은 사용자 복사 입력에 직접 붙여, 그것은 때 사용자 입력 스크립트의 조각을 내 경고 메시지를 보여주지 노력이 없지만 스크립트는 여전히 실행되었습니다!
$("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, "<$1>"));
e.preventDefault();
return false;
}
});
입력 값의 스크립트가 브라우저에서 실행되는 이유와 실행 시점을 이해할 수 없습니까? 이 메커니즘을 설명하거나 관련성이있는 기사가 있습니까? 내가 눈치 채지 못했던 것을 얻었습니까? 도움이된다고 생각되는 기사가 있으면 알려 주시기 바랍니다. 감사합니다. .
모든 답변과 의견을 보내 주셔서 감사합니다. 어쩌면 나는 분명히 설명하지 않았을지도 모른다. 나는 을 복사했을 때 <script>alert("hi");</script>
을 복사하여 입력 창에 붙여 넣으면 브라우저가 경고 창을 표시하고 "hi"를 보였다.
나는 또한 단지 $("input").val('<script>alert("hi");</script>')
를 사용하는 한, 그것은 경고 창에 메시지를 표시하지 않습니다,하지만 난 입력의 focus
및 blur
이벤트를 트리거하는 경우, 너무 경고 창을하라는 메시지가 표시됩니다.
그래서 코드가 실행되는 이유는 무엇입니까?
이 문제를 해결하기 위해 브라우저를 신뢰할 수 없습니다. 자바 스크립트를 단순히 비활성화하면 이미이를 우회합니다. (이것이 옵션이 아니더라도 브라우저없이 사용자 정의 HTTP 호출을 작성하는 것은 그리 어렵지 않습니다.) 이 서버 측을 사용자에게 출력하기 전에 이스케이프 처리해야합니다. – Ivar
"입력 값의 스크립트가 브라우저에 의해 실행되는 이유를 이해하지 못합니다.">> 말할 필요가없는 한 그렇지 않습니다. 아래의 @RichouHunter는 당신이 그것을 말할 때의 예를 보여주었습니다 : 당신이 그 입력 값을 가져 왔을 때 그것을 당신의 서버에 저장하고 (예를 들면 사용자 이름으로) 그 값을 다른 페이지에 표시하십시오. – TKoL
내가 이해하고 있는지 잘 모르겠다. 스크립트는 입력 필드에 입력 할 때 실행되지 않고 클라이언트에 다시 제공 될 때만 실행될 수 있습니다. 그러나 그때까지는 입력이 유효하고 서버 측에서 이스케이프되어야합니다. – Clinton