[RUBY-ON-RAILS] 왜 부분을 렌더링하기 전에 escape_javascript?
RUBY-ON-RAILS왜 부분을 렌더링하기 전에 escape_javascript?
나는이 Railscast 에피소드보고 escape_javascript에 대한 호출이 여기에 왜 필요한지 궁금하네요 :
$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>");
escape_javascript 용도는 무엇입니까?
레일의 문서에 따르면 :
그러나 그것은 나에게 많은 의미하지 않는다.
해결법
-
==============================
1.당신은 사용자가 브라우저가 실제로 실행하는 자바 스크립트를 게시하지 않습니다 때문에?
당신은 사용자가 브라우저가 실제로 실행하는 자바 스크립트를 게시하지 않습니다 때문에?
-
==============================
2.그것은 당신이 두 부분의 코드를 분할하면 이해하기 쉽다.
그것은 당신이 두 부분의 코드를 분할하면 이해하기 쉽다.
첫 번째 부분의 $ ( "# 리뷰 ') APPEND ("<% = ... %>. "); ERB와 자바 스크립트입니다. 의 <% = ... %>이 그것의 루비 코드 내부 반환 무엇으로 대체 될 것이라고이 의미합니다. 그 교체의 결과는 클라이언트가 처리 할 때, 그렇지 않으면 오류가 발생합니다, 유효한 자바 스크립트해야합니다. 그 첫 번째 것은 그래서 : 당신은 유효한 자바 스크립트가 필요합니다.
고려해야 할 또 다른 점은 큰 따옴표로 자바 스크립트 문자열 안에 포함되어야 생성 어떤 루비 즉 - 통지 주위에 따옴표의 <% = ... %>. 생성 된 자바 스크립트는 다음과 같이 것이 의미 :
$("#reviews").append("...");
이제 <... % = %> 내부 루비 부분을 살펴 보자. 무엇을 렌더링 않습니다 (: 부분 => @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>")
문안 인사!
-
==============================
3.사용자는 사용자가 응용 프로그램을 제어 할 수 있도록, 왼쪽 이스케이프는 잠재적으로 실행 얻을 것이다 경우 그 악성 코드 (악의적 인 사용자)를 게시 할 수 있습니다.
사용자는 사용자가 응용 프로그램을 제어 할 수 있도록, 왼쪽 이스케이프는 잠재적으로 실행 얻을 것이다 경우 그 악성 코드 (악의적 인 사용자)를 게시 할 수 있습니다.
이 시도:
<% variable = '"); alert("hi there' %> $("#reviews").append("<%= variable %>");
당신이 변수를 탈출하지 않으면 정말 레일의 구문을 잘 알고 있지만 다음 경고 상자가 표시됩니다, 그리고 난 그이 동작을위한 것입니다 것 같아요.
-
==============================
4.여기에 소스를 보면, 훨씬 명확하게 될 것입니다.
여기에 소스를 보면, 훨씬 명확하게 될 것입니다.
이 기능은 다음 두 가지를 수행합니다 :
당신이 escape_javascript를 사용하는 경우, 일반적으로 다른 문자열에 포함 된 또는 동적 HTML 기존된다. 당신은 확실히 이렇게하면 전체 페이지를 렌더링하지하지 않습니다 있는지 확인해야합니다.
이 응답의 일부 측면은 다른 응답을 지적했다하지만 난 함께 모든 항목을 가져오고 HTML 이스케이프 탈출 자바 스크립트의 차이를 포함하고 싶었다. 또한, 일부 응답이 기능은 스크립트 삽입을 방지하는 데 도움이 것을 언급한다. 나는이 기능의 목적을 생각하지 않습니다. 예를 들어, 고객 리뷰 리뷰는 경고가있는 경우 ( '안녕하세요'), 단지 노드로 추가하면 팝업이 발생하지 않습니다. 당신은 페이지로드 또는 다른 이벤트를 통해 트리거되는 함수 내에서 그것을 삽입되지 않습니다. 단순히이 자바 스크립트로 실행하는 것을 의미하지 않는 HTML의 일환으로 ( '안녕하세요') 경고를 가지고.
그건 내가 스크립트 삽입이 불가능하다는 것을 부정하고 있지 않다 말했다. 그러나 당신은 당신이 사용자 데이터를 찍을 때 조치를 취할하고 데이터베이스에 저장해야한다는 것을 방지 할 수 있습니다. 기능 및 예를 들어 당신이 제공하는 이미 저장된 정보를 렌더링 관련이 있습니다.
난이 도움이 귀하의 질문에 대한 답변이 되었기를 바랍니다.
from https://stackoverflow.com/questions/1620113/why-escape-javascript-before-rendering-a-partial by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일, MySQL과 스노우 레오파드 (Snow Leopard) (0) | 2020.02.06 |
---|---|
[RUBY-ON-RAILS] 매버릭스 내 Mac에서 PG 보석을 설치하는 것이 불가능 (0) | 2020.02.06 |
[RUBY-ON-RAILS] 레일 : 의존 => VS 파괴 : 의존 => : DELETE_ALL를 (0) | 2020.02.05 |
[RUBY-ON-RAILS] 초기화되지 않은 상수의 ActiveSupport :: 종속성 :: 뮤텍스 (나가서 설명하자면 NameError) (0) | 2020.02.05 |
[RUBY-ON-RAILS] 레일에 대한 해제 액티브 4 (0) | 2020.02.05 |