부분을 렌더링하기 전에 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
. 된 동작이라고 의도 생각하지 않습니다 .
여기서 소스는 훨씬 더 명확합니다.
이 기능은 다음 두 가지를 수행합니다.
입력 된 문자를 JS_ESCAPE_MAP에 정의 된 문자로 대체합니다.
이것의 목적은 자바 코드가 포함 된 외부를 방해하지 않고 자바 선택가 선택하는 것입니다. 예를 들어 큰 따옴표로 묶인 경우에는 자바 펼쳐 언어가있는 경우 코드가 깨지지. 리터럴에 대한 모든 따옴표는 작은 따옴표로 묶어야합니다.
- 이 함수는 결과가 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
'IT' 카테고리의 다른 글
단위 테스트에서 콘솔에 쓸 수 있습니까? (0) | 2020.07.15 |
---|---|
Rails : where 문보다 크거나 작음 (0) | 2020.07.15 |
Swift의 읽기 전용 및 계산되지 않은 변수 속성 (0) | 2020.07.15 |
객체마다? (0) | 2020.07.15 |
react.js에서 한 후 페이지 맨 위로 스크롤 (0) | 2020.07.15 |