[javascript] JavaScript 스크립트 실행을 거부했습니다. 요청 내에서 찾은 스크립트의 소스 코드

WebKit에서 JavaScript에 다음 오류가 발생합니다.

JavaScript 스크립트 실행을 거부했습니다. 요청 내에서 찾은 스크립트의 소스 코드입니다.

코드는 JavaScript 스피너 용 입니다. ASCII Art를 참조하십시오 .

정상적으로 작동하는 데 사용 된 코드는 Camino 및 Firefox에서 여전히 올바르게 작동합니다. 오류는 페이지가 POST를 통해 저장되고 GET을 통해 검색 될 때만 발생하는 것으로 보입니다. Chrome / Mac 및 Safari / Mac 모두에서 발생합니다.

누구든지 이것이 의미하는 바를 알고 있으며 이것을 고치는 방법을 알고 있습니까?



답변

XSS (사이트 간 스크립팅) 공격 을 방지하기위한 보안 조치 입니다.

이는 일부 JavaScript 코드가 HTTP POST 요청을 통해 서버로 전송되고 동일한 코드가 HTTP 응답을 통해 반환 될 때 발생합니다. Chrome에서이 상황을 감지하면 스크립트 실행이 거부되고 오류 메시지가 표시 Refused to execute a JavaScript script. Source code of script found within request됩니다.

심층 보안 : 새로운 보안 기능에 대한이 블로그 게시물도 참조하십시오 .


답변

이 “기능”은 X-XSS-Protection영향을받는 페이지에 비표준 HTTP 헤더 를 전송하여 비활성화 할 수 있습니다 .

X-XSS-Protection: 0


답변

간단한 답변 : 자바 스크립트를 처음 제출 한 후 페이지를 새로 고침하거나 수정중인 페이지를 표시 할 URL을 누르세요.

긴 답변 : 양식에 입력 한 텍스트에 자바 스크립트가 포함되어 있고 브라우저가 반드시 여러분이 자바 스크립트의 소스임을 알 수있는 것은 아니기 때문에 브라우저가이 JS의 소스가 아니라고 가정하는 것이 더 안전합니다. 그것을 실행하지 마십시오.

: 내가 이메일이나 페이스 북에 자바 스크립트가 포함 된 링크를 제공했다고 가정 해 보겠습니다 . 그리고 자바 스크립트가 모든 친구들에게 내 멋진 링크를 보낼 것이라고 상상해보십시오. 따라서 해당 링크를 호출하는 게임은 간단하게 페이지에 포함될 자바 스크립트를 보낼 위치를 찾는 것입니다.

Chrome 및 기타 WebKit 브라우저는 요청에있는 경우 응답에있는 자바 스크립트를 실행하지 않음으로써 이러한 위험을 완화하려고합니다. 브라우저가 JS를 실행하지 않기 때문에 내 사악한 공격이 차단됩니다.

귀하의 경우 양식 필드에 제출하고 있습니다. 양식 필드의 게시물은 자바 스크립트를 표시 할 페이지를 렌더링하므로 브라우저가 걱정하게됩니다. 그러나 자바 스크립트가 실제로 저장되어있는 경우 양식을 제출하지 않고 동일한 페이지를 클릭하면 실행될 수 있습니다.


답변

다른 사람들이 말했듯이 이는 HTTP 응답에 요청에 포함 된 JavaScript 및 / 또는 HTML 문자열이 포함되어있을 때 발생합니다. 이는 일반적으로 양식 필드에 JS 또는 HTML을 입력하여 발생하지만 URL 매개 변수를 수동으로 조정하는 것과 같은 다른 방법으로도 트리거 될 수 있습니다.

이것의 문제는 나쁜 의도를 가진 누군가가 원하는 JS를 값으로 넣고 악성 JS 값으로 해당 URL에 연결하여 사용자에게 문제를 일으킬 수 있다는 것입니다.

에서 거의 모든 경우,이 문제를 해결할 수 있습니다 응답을 인코딩 HTML 예외가 있기는하지만,. 예를 들어 <script>태그 내부의 콘텐츠에는 안전하지 않습니다 . 다른 특정 경우는 다르게 처리 될 수 있습니다. 예를 들어 URL에 입력을 삽입하는 것이 URL 인코딩을 통해 더 잘 제공됩니다.

Kendall Hopkins가 언급했듯이 JSFiddle 과 같은 애플리케이션을 만드는 것과 같이 실제로 양식 입력에서 JavaScript를 실행 하려는 경우가있을 수 있습니다 . 이 경우 맹목적으로 다시 작성하기 전에 최소한 백엔드 코드의 입력을 스크러빙하는 것이 좋습니다. 그 후, 그가 언급 한 방법을 사용하여 XSS 차단 (적어도 Chrome에서는)을 방지 할 수 있지만 공격자에게 노출된다는 점에 유의하십시오.


답변

데이터베이스에 커밋 한 직후에이 해키 PHP 트릭을 사용했지만 스크립트가 내 _GET요청 에서 렌더링되기 전에 사용했습니다 . :

if(!empty($_POST['contains_script'])) {
    echo "<script>document.location='template.php';</script>";
}

이것은 저에게 가장 저렴한 솔루션이었습니다.


답변