[ruby-on-rails] 원시 대 html_safe 대 h를 사용하여 HTML을 이스케이프 처리하지 않기

다음 문자열이 있다고 가정하십시오.

@x = "<a href='#'>Turn me into a link</a>"

내보기에는 링크가 표시되기를 원합니다. 즉, @x의 모든 항목이 이스케이프 처리되지 않고 문자열로 표시되는 것을 원하지 않습니다. 사용의 차이점은 무엇입니까

<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>

?



답변

레일 3 고려 :

html_safe실제로 “문자열을 HTML 안전”으로 설정합니다 (이보다 조금 더 복잡하지만 기본적으로 그렇습니다). 이런 식으로 도우미 나 모델에서 HTML Safe 문자열을 마음대로 반환 할 수 있습니다.

h헬퍼가 제공하므로 컨트롤러 또는 뷰 내에서만 사용할 수 있습니다. 출력을 강제로 이스케이프합니다. 실제로 더 이상 사용되지는 않지만 더 이상 사용하지 않을 것입니다. 유일한 사용법은 html_safe선언 을 “되돌아가는 것” 입니다.

식 앞에 접두사를 붙인 raw것은 실제로 to_s체인으로 연결된 호출과 동일 html_safe하지만, 같은 도우미에 선언 h되므로 컨트롤러 및 뷰에서만 사용할 수 있습니다.

SafeBuffers and Rails 3.0 “은 SafeBuffers ( html_safe매직 을 수행하는 클래스 )의 작동 방식에 대한 좋은 설명입니다 .


답변

반복되는 것으로 생각 합니다. 문자열을 HTML 이스케이프 html_safe하지 않습니다 . 실제로 문자열이 이스케이프되는 것을 방지합니다.

<%= "<script>alert('Hello!')</script>" %>

둘 것이다:

&lt;script&gt;alert(&#x27;Hello!&#x27;)&lt;/script&gt;

HTML 소스에 (예, 안전합니다!)

<%= "<script>alert('Hello!')</script>".html_safe %>

경고 대화 상자가 나타납니다 (원하는 것이 확실합니까?). 따라서 html_safe사용자가 입력 한 문자열 을 호출하고 싶지 않을 것입니다 .


답변

차이점은 Rails ‘ html_safe()raw()입니다. Yehuda Katz의 훌륭한 게시물이 있으며 실제로 다음과 같이 요약됩니다.

def raw(stringish)

  stringish.to_s.html_safe

end

예, 입력을 String으로 강제 한 다음 호출 raw()하는 래퍼 입니다. 또한 모듈의 도우미 인 반면 String 클래스의 메서드는 새로운 ActiveSupport :: SafeBuffer 인스턴스를 만드는 메서드입니다.html_safe()html_safe()raw()html_safe()@dirty 플래그 .

Rails ‘html_safe vs. raw “를 참조하십시오 .


답변

  1. html_safe :

    문자열을 신뢰할 수있는 안전으로 표시합니다. 추가 이스케이프를 수행하지 않고 HTML에 삽입됩니다.

    "<a>Hello</a>".html_safe
    #=> "<a>Hello</a>"
    
    nil.html_safe
    #=> NoMethodError: undefined method `html_safe' for nil:NilClass
  2. raw :

    raw그냥 래퍼 html_safe입니다. raw문자열이 될 가능성이있는 경우 사용하십시오 nil.

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
  3. h에 대한 별칭 html_escape:

    HTML 태그 문자를 이스케이프 처리하는 유틸리티 메소드입니다. 안전하지 않은 내용을 피하려면이 방법을 사용하십시오.

    Rails 3 이상에서는 기본적으로 사용되므로이 방법을 명시 적으로 사용할 필요가 없습니다


답변

가장 안전한 방법은 다음과 같습니다. <%= sanitize @x %>

XSS를 피할 것입니다!


답변

Simple Rails 용어로 :

h 렌더링으로 인해 HTML이 손상되지 않도록 HTML 태그를 숫자 문자로 제거

html_safe 문자열이 html 저장으로 간주되도록 문자열에 부울을 설정합니다.

raw html_safe를 문자열로 변환합니다.


답변