문자열을 HTML 인코딩 / 이스케이프하는 방법은 무엇입니까? 내장이 있습니까?


98

HTML 페이지에 텍스트로 표시하려는 신뢰할 수없는 문자열이 있습니다. HTML 엔터티로 ' <'및 ' &' 문자를 이스케이프해야합니다 . 소란이 적을수록 좋습니다.

나는 UTF8을 사용하고 있으며 악센트 부호가있는 문자에 다른 엔티티가 필요하지 않습니다.

Ruby 또는 Rails에 내장 함수가 있습니까? 아니면 직접 롤링해야합니까?


2
OWASP에 따르면 HTML 요소 콘텐츠에서 적절한 XSS 보호를 위해 다음 6 개 문자를 이스케이프해야합니다.&<>"'/
— sffc

답변:


94

h도우미 방법 :

<%=h "<p> will be preserved" %>

글쎄, 그것은 또한 필요하지 않지만>를 이스케이프합니다.
— kch

괄호를 사용하여 일부는 h로 인쇄하고 일부는없이 인쇄 할 수 있습니다. <% = h ( "<p") + ">"%>
— Trevor Bramble

이제 그것은 어리석은 일입니다. 탈출하든 안하든 상관 없어요. 나는 그것이 html 사양에 따라 필요하지 않다는 것을 지적하고 있습니다.
— kch

12
XML 사양의 ']]>'를 텍스트에서 제외해야한다는 다소 성가신 주장으로 인해 XHTML 에서 가끔 필요합니다 ( 'CharData'프로덕션 참조). 이것은 일반적으로 그것을 항상 피하는 것이 일반적으로 더 쉽고 무해합니다.
— bobince

19
관심있는 사람들을 h위한 별칭은html_escape
— lightswitch05

141

Ruby CGI 클래스를 확인하십시오. HTML과 URL을 인코딩하고 디코딩하는 방법이 있습니다.

CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo &quot;bar&quot; &lt;baz&gt;"

12
감사합니다. 컨트롤러에서 할 수 있기 때문에 훌륭합니다. 물론 그렇게하겠다는 것은 아닙니다.
— Dan Rosenstark 2011 년

2
이는 기능 / 통합 테스트에서 유용하며, 템플릿에 삽입 된 콘텐츠의 정확성을 확인하는 데 유용합니다 (콘텐츠가 HTML 이스케이프 처리되어야하는 경우).
— Alex D

콘텐츠가 클라이언트 웹 사이트에 표시되는 경우 (보기를 제어 할 수없는 경우) 데이터베이스에 삽입하기 전에 html을 이스케이프하는 문제는 무엇입니까? 다른 해결 방법이 있습니까?
— n00b

오른쪽-데이터베이스에 들어가기 전에 이스케이프하는 것이 좋습니다. 추가하기 전에 이스케이프되지 않은 오래된 해킹이 없는지 확인하고 싶을뿐입니다 ...
— Kevin

5
: 나는 더 많은 동의어처럼 CGI.escape_html
— Trantor 리우

77

Ruby on Rails 3에서 HTML은 기본적으로 이스케이프됩니다.

이스케이프되지 않은 문자열의 경우 다음을 사용하십시오.

<%= raw "<p>hello world!</p>" %>

25

ERB :: Util.html_escape 는 어디에서나 사용할 수 있습니다. requireRails에서 사용하지 않고 사용 가능 합니다.


이 실제로 사용하고 CGI.escapeHTML아래
— akostadinov

@akostadinov-결과는 다릅니다. 예를 들어, ERB :: Util.html_escape는 아포스트로피를 & # x27; CGI 반면 :: escapeHTML은하지 않습니다
— 루이 세이 어스

@LouisSayers, 어떻게 이런 일이 일어날 수 있는지 모르겠습니다 :```[43] pry (main)> show-source ERB :: Util.html_escape From : /usr/share/ruby/erb.rb @ line 945 : Owner # <클래스 : ERB :: 백분율> 가시성 : 라인 대중의 수 : 3 DEF html_escape (들) CGI.escapeHTML (s.to_s) 끝```
— akostadinov

@akostadinov-흠 ... 그냥 다시 실행하고 예, 그들은 동일한 출력을 생성했습니다. 나는 직장에서 이것을 실행할 때 다른 결과를 낳았다 고 맹세합니다 (아마 다른 erb / cgi 버전 동작?). 내일 직장에서 다른 결과를 얻은 이유를 알아야합니다.
— Louis Sayers

17

대부분의 사람들이 CGI요즘 사용하지 않기 때문에 어디에서나 HTML 이스케이프를 사용하는 Christopher Bradford의 답변에 추가하여 다음을 사용할 수도 있습니다 Rack.

require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')

모델 인스턴스 메서드에서 비슷한 방식으로 문자열을 이스케이프하는 더 좋은 방법이 있습니까?
— 코딩 활성화

15

당신은 하나를 사용하고 있습니다 h()또는 html_escape(), 그러나 대부분의 사람들이 사용하는 h()관례. in rails의 h()약자입니다 html_escape().

컨트롤러에서 :

@stuff = "<b>Hello World!</b>"

귀하의 관점에서 :

<%=h @stuff %>

HTML 소스를 보면 실제로 데이터를 굵게 표시하지 않고 출력을 볼 수 있습니다. 즉, &lt;b&gt;Hello World!&lt;/b&gt;.

다음과 같이 표시됩니다. <b>Hello World!</b>


9

다른 방법의 비교 :

> CGI::escapeHTML("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

> Rack::Utils.escape_html("quote ' double quotes \"")
=> "quote &#x27; double quotes &quot;"

> ERB::Util.html_escape("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

Rails ActiveMailer 이스케이프와 호환되도록 직접 작성했습니다.

def escape_html(str)
  CGI.escapeHTML(str).gsub("&#39;", "'")
end

0

h() 따옴표를 이스케이프하는데도 유용합니다.

예를 들어, 텍스트 필드를 사용하여 링크를 생성하는보기가 있습니다 result[r].thtitle. 텍스트에는 작은 따옴표가 포함될 수 있습니다. result[r].thtitle확인 메서드에서 이스케이프하지 않으면 Javascript가 중단됩니다.

&lt;%= link_to_remote "#{result[r].thtitle}", :url=>{ :controller=>:resource,
:action         =>:delete_resourced,
:id     => result[r].id,
:th     => thread,                                                                                                      
:html       =>{:title=> "<= Remove"},                                                       
:confirm    => h("#{result[r].thtitle} will be removed"),                                                   
:method     => :delete %>

&lt;a href="#" onclick="if (confirm('docs: add column &amp;apos;dummy&amp;apos; will be removed')) { new Ajax.Request('/resource/delete_resourced/837?owner=386&amp;th=511', {asynchronous:true, evalScripts:true, method:'delete', parameters:'authenticity_token=' + encodeURIComponent('ou812')}); }; return false;" title="&lt;= Remove">docs: add column 'dummy'</a>

참고 : :html제목 선언은 Rails에 의해 마술처럼 이스케이프됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.