다음 문자열이 있다고 가정하십시오.
@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 “은 SafeBuffer
s ( html_safe
매직 을 수행하는 클래스 )의 작동 방식에 대한 좋은 설명입니다 .
답변
반복되는 것으로 생각 합니다. 문자열을 HTML 이스케이프 html_safe
하지 않습니다 . 실제로 문자열이 이스케이프되는 것을 방지합니다.
<%= "<script>alert('Hello!')</script>" %>
둘 것이다:
<script>alert('Hello!')</script>
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 “를 참조하십시오 .
답변
-
html_safe
:문자열을 신뢰할 수있는 안전으로 표시합니다. 추가 이스케이프를 수행하지 않고 HTML에 삽입됩니다.
"<a>Hello</a>".html_safe #=> "<a>Hello</a>" nil.html_safe #=> NoMethodError: undefined method `html_safe' for nil:NilClass
-
raw
:raw
그냥 래퍼html_safe
입니다.raw
문자열이 될 가능성이있는 경우 사용하십시오nil
.raw("<a>Hello</a>") #=> "<a>Hello</a>" raw(nil) #=> ""
-
h
에 대한 별칭html_escape
:HTML 태그 문자를 이스케이프 처리하는 유틸리티 메소드입니다. 안전하지 않은 내용을 피하려면이 방법을 사용하십시오.
Rails 3 이상에서는 기본적으로 사용되므로이 방법을 명시 적으로 사용할 필요가 없습니다
답변
가장 안전한 방법은 다음과 같습니다. <%= sanitize @x %>
XSS를 피할 것입니다!
답변
Simple Rails 용어로 :
h
렌더링으로 인해 HTML이 손상되지 않도록 HTML 태그를 숫자 문자로 제거
html_safe
문자열이 html 저장으로 간주되도록 문자열에 부울을 설정합니다.
raw
html_safe를 문자열로 변환합니다.