Sinatra& HAML:为整个模板自动转义/转换不安全的HTML字符?

时间:2013-03-12 15:02:50

标签: html ruby sinatra haml

我有一个小的sinatra应用程序,我用来运行一个基本的网站。该网站的内容由客户提供,其中大部分来自PDF。由于我不必手动将所有<替换为&lt;,将&替换为&amp;,是否有办法配置HAML / Sinatra来执行此操作对我自动?

基本上,我有一些看起来像这样的块:

%p
  large block of text here...
  multi-line so I can see it in my IDE...
  more lines here...

我想找到一些配置选项,告诉HAML浏览所有内容,并用他们的HTML实体对应物替换不安全的字符。

我尝试使用HTMLEntities gem,但这个网站有很多多行段落,我似乎无法让它工作。我的意思是我会在server.rb文件中执行类似的操作:

def "/some_url"
  @encoder = HTMLEntities.new
  haml :some_template
end

在我的模板中:

%p
  = @encoder.encode("Really long multiline string...
    some more lines here...
    and more lines...")

如果错过关闭),就会出错。

2 个答案:

答案 0 :(得分:6)

您可以使用:escaped filter

%p
  :escaped
    A block of text here that might
    contain & and <.

输出:

<p>
  A block of text here that might
  contain &amp; and &lt;.
</p>

它不是很自动,但可能会减少所需的编辑。

答案 1 :(得分:2)

也许你正在寻找这个:

require 'cgi'
CGI::escapeHTML('unsafe string <script>kill() && destroy()</script>'
#=> "unsafe string &lt;script&gt;kill() &amp;&amp; destroy()&lt;/script&gt;"

修改

现在我真的得到了你想要的东西。只需使用:escape_html => true,您就可以将文本包装在='...text here...'中,因为所有字符串都是隐式转义的。

require 'sinatra'

get '/' do
  haml :index, :escape_html => true
end

__END__

@@layout
!!! 5
%html
  %head
    %title Example
  %body
    = yield

@@index
%p
  ='Here is some <em>unsafe</em> HTML.'
  ='<script type="text/javascript">'
  ='killKittens() && destroyHumanity()'
  ='</script>'

结果:

$ curl localhost:4567
<!DOCTYPE html>
<html>
  <head>
    <title>Example</title>
  </head>
  <body>
    <p>
      Here is some &lt;em&gt;unsafe&lt;/em&gt; HTML.
      &lt;script type=&quot;text/javascript&quot;&gt;
      killKittens() &amp;&amp; destroyHumanity()
      &lt;/script&gt;
    </p>
  </body>
</html>