IT

부분을 ​​렌더링하기 전에 escape_javascript가 필요한 이유는 무엇입니까?

lottoking 2020. 7. 15. 07:14
반응형

부분을 ​​렌더링하기 전에 escape_javascript가 필요한 이유는 무엇입니까?


이 Railscast 에피소드를 보고 escape_javascript여기에 전화 가 필요한지 궁금 합니다.

$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>");

어떤 escape_javascript위해 사용 보증입니까?

에 따르면 레일 워드 프로세서 :

escape_javascript (자바 펼쳐보기)

JavaScript 세그먼트에 대한 이스케이프 캐리어 리턴 및 작은 따옴표 및 큰 따옴표.

그러나 그것은 나에게별로 의미가 없습니다.


브라우저가 실행되는 JavaScript를 게시하는 사용자를 사용하지 않기 때문에?


코드를 두 부분으로 나누면 이해하기가 더 있습니다.

첫 번째 부분 $("#reviews").append("<%= ... %>");은 erb를 사용하는 자바 펼쳐집니다. 이것은 <%= ... %>내부의 루비 코드가 반환하는 것입니다. 교체 결과는 유효한 선언합니다. 국제적 클라이언트가 처리 할 때 오류가 발생합니다. 이것이 첫 번째입니다 : 유효한 javascript 가 필요 합니다 .

할 또 다른 사항은 루비가 생성하는 모든 것이 큰 따옴표로 묶인 자바 펼쳐에 포함 것 <%= ... %>입니다. 즉, 생성 된 자바 펼쳐는 다음과 가변합니다.

$("#reviews").append("...");

이제 안에있는 루비 부분을 보자 <%= ... %>.무엇 render(:partial => @review)? html, css ... 또는 더 많은 자바 펼쳐-모든 종류의 코드를 할 수 있음을 의미합니다.

우리의 부분에 이와 같은 간단한 HTML이 포함되어 있다면 어떻게 될까요?

<a href="/mycontroller/myaction">Action!</a> 

자바 펼쳐가 큰 따옴표로 묶인 인용을 사용했음을 기억하십니까? 우리가 포함하는 <%= ... %>부분의 코드로 대체한다면 , 우리는 href=큰 따옴표가있는 부분에 문제가 있습니다 ! 자바 펼쳐가 유효하지 않습니다.

// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");

이 일이 발생하지 않도록하기 위해 복제를 자르지 않도록 특수 문자 이스케이프 처리해야 합니다 . 대신 생성하는 것이 필요합니다.

<a href=\"/mycontroller/myaction\">Action!</a>

이것은 무엇을 하는가 escape_javascript. "중단"하지 않습니다. 사용하면 원하는 출력을 얻을 수 있습니다.

$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")

문안 인사!


사용자는 이스케이프가없는 응용 프로그램을 제어 할 수있는 악성 코드 (악의적 인 사용자)를 게시 할 수 있습니다.

이 시도 :

<% variable = '"); alert("hi there' %>
$("#reviews").append("<%= variable %>");

레일의 구문에 익숙하지 않지만 탈출하지 않고 경고 하지 않습니다 variable. 된 동작이라고 의도 생각하지 않습니다 .


여기서 소스는 훨씬 더 명확합니다.

이 기능은 다음 두 가지를 수행합니다.

  1. 입력 문자를 JS_ESCAPE_MAP에 정의 된 문자로 대체합니다.

    이것의 목적은 자바 코드가 포함 된 외부를 방해하지 않고 자바 선택가 선택하는 것입니다. 예를 들어 큰 따옴표로 묶인 경우에는 자바 펼쳐 언어가있는 경우 코드가 깨지지. 리터럴에 대한 모든 따옴표는 작은 따옴표로 묶어야합니다.

  2. 이 함수는 결과가 html 안전인지 확인합니다. 필요한 경우 html로 고객 생성 결과를 반환하기 위해 필요한 이스케이프 처리를 수행합니다.

escape_javascript를 사용하는 경우 일반적으로 사용되는 기존의 사용하는 기존의 html에 동적으로 포함됩니다. 이렇게하면 전체 페이지가 무시해야합니다.

이 응답의 일부 단원은 다른 응답에서 지적하고 Javascript 이스케이프 처리와 html 이스케이프 처리의 차이점을 포함하여 모든 항목을 가져오고 싶었습니다. 또한 일부 응답은이 함수가 펼쳐진 것을 피하는 데 도움이된다고 주장합니다. 나는 이것이 기능의 목적이라고 생각하지 않습니다. 예를 들어, 리뷰에서 리뷰에 경고가있는 경우 ( 'hi there') 노드에 추가하면 팝업이 실행되지 않습니다. 페이지로드시 또는 이벤트를 통해 트리거되는 함수를 포함하지 않습니다. HTML의 일부로 경고 ( 'hi there')가 실행으로 실행 의미는 아닙니다.

그것은 전개되지 않는다. 그러나 사용자 데이터를 가져 오기 위해 필요한 조치를 취해야합니다. 제공하는 기능 및 예제는 이미 멀티미디어 정보와 관련이 있습니다.

이것이 귀하의 질문에 도움이 되길 바랍니다.

참고 URL : https://stackoverflow.com/questions/1620113/why-escape-javascript-before-rendering-a-partial

반응형