문자열을 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.