복붙노트

[RUBY-ON-RAILS] 왜 부분을 렌더링하기 전에 escape_javascript?

RUBY-ON-RAILS

왜 부분을 렌더링하기 전에 escape_javascript?

나는이 Railscast 에피소드보고 escape_javascript에 대한 호출이 여기에 왜 필요한지 궁금하네요 :

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

escape_javascript 용도는 무엇입니까?

레일의 문서에 따르면 :

그러나 그것은 나에게 많은 의미하지 않는다.

해결법

  1. ==============================

    1.당신은 사용자가 브라우저가 실제로 실행하는 자바 스크립트를 게시하지 않습니다 때문에?

    당신은 사용자가 브라우저가 실제로 실행하는 자바 스크립트를 게시하지 않습니다 때문에?

  2. ==============================

    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. ==============================

    3.사용자는 사용자가 응용 프로그램을 제어 할 수 있도록, 왼쪽 이스케이프는 잠재적으로 실행 얻을 것이다 경우 그 악성 코드 (악의적 인 사용자)를 게시 할 수 있습니다.

    사용자는 사용자가 응용 프로그램을 제어 할 수 있도록, 왼쪽 이스케이프는 잠재적으로 실행 얻을 것이다 경우 그 악성 코드 (악의적 인 사용자)를 게시 할 수 있습니다.

    이 시도:

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

    당신이 변수를 탈출하지 않으면 정말 레일의 구문을 잘 알고 있지만 다음 경고 상자가 표시됩니다, 그리고 난 그이 동작을위한 것입니다 것 같아요.

  4. ==============================

    4.여기에 소스를 보면, 훨씬 명확하게 될 것입니다.

    여기에 소스를 보면, 훨씬 명확하게 될 것입니다.

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

    당신이 escape_javascript를 사용하는 경우, 일반적으로 다른 문자열에 포함 된 또는 동적 HTML 기존된다. 당신은 확실히 이렇게하면 전체 페이지를 렌더링하지하지 않습니다 있는지 확인해야합니다.

    이 응답의 일부 측면은 다른 응답을 지적했다하지만 난 함께 모든 항목을 가져오고 HTML 이스케이프 탈출 자바 스크립트의 차이를 포함하고 싶었다. 또한, 일부 응답이 기능은 스크립트 삽입을 방지하는 데 도움이 것을 언급한다. 나는이 기능의 목적을 생각하지 않습니다. 예를 들어, 고객 리뷰 리뷰는 경고가있는 경우 ( '안녕하세요'), 단지 노드로 추가하면 팝업이 발생하지 않습니다. 당신은 페이지로드 또는 다른 이벤트를 통해 트리거되는 함수 내에서 그것을 삽입되지 않습니다. 단순히이 자바 스크립트로 실행하는 것을 의미하지 않는 HTML의 일환으로 ( '안녕하세요') 경고를 가지고.

    그건 내가 스크립트 삽입이 불가능하다는 것을 부정하고 있지 않다 말했다. 그러나 당신은 당신이 사용자 데이터를 찍을 때 조치를 취할하고 데이터베이스에 저장해야한다는 것을 방지 할 수 있습니다. 기능 및 예를 들어 당신이 제공하는 이미 저장된 정보를 렌더링 관련이 있습니다.

    난이 도움이 귀하의 질문에 대한 답변이 되었기를 바랍니다.

  5. from https://stackoverflow.com/questions/1620113/why-escape-javascript-before-rendering-a-partial by cc-by-sa and MIT license