使用换行显示用户输入html

时间:2017-06-08 15:44:57

标签: ruby-on-rails ruby

我的应用程序中有注释部分,用户在文本区域中输入输入。我想阻止他们输入的换行符,但也将html显示为字符串。例如,如果comment.body

Hello, this is the code: <a href='foo'>foo</a>

Bye

我希望它如上所示。与其他任何内容相同,包括iframe标记。

我最接近的是:

= simple_format(comment.body)

但它清理了html代码并且没有显示。示例:foo <iframe>biz</iframe> bar显示为:

foo biz bar

我应该怎样做才能达到我的目的?

3 个答案:

答案 0 :(得分:2)

HTML safe允许将注释中的html用作html,但会跳过换行符,因此快速将\n替换为<br />将覆盖新行

comment.body.gsub("\n", "<br />").html_safe

如果您希望显示html而不是呈现,请结帐CGI::escapeHTML(),然后执行gsub,以便<br />不会被转义。

CGI::escapeHTML(comment.body).gsub("\n", "<br />")

答案 1 :(得分:2)

在过去做过类似的事情之后,我认为你必须首先理解为什么HTML会根据用户输入进行清理。

想象一下,我将以下内容写入接受HTML的字段并将其显示在首页。

<script>alert('Hello')</script>

代码将为访问首页的任何人执行,并为每个访问者烦人地触发JS警报。

可能还没有太多问题,但想象一下我写了一些AJAX请求,它将用户会话ID发送到我自己的服务器。现在这是一个问题......因为人们的会话被劫持了。

此外,还有一个完整的基于JavaScript的开发框架,名为BeEF,它依赖于这种类型的网站漏洞利用,称为跨站点脚本(XSS)。

BeEF做了非常可怕的事情,在考虑用户生成的HTML时值得一看。

http://guides.rubyonrails.org/security.html#cross-site-scripting-xss

那该怎么办?好吧,如果您在数据库中签入,您会看到标签实际上已存储,但是您指出的标签不会显示。

你可以.html_safe内容,但我再强烈建议不要这样做。

也许您应该自己编写替代.html_safe方法,例如html_safe_whitelisted_tags

至于删除换行符,您表示要按原样显示。因此,正如迈克尔所指出的那样,将/n替换为<br>将是您的解决方案。

comment.body.gsub('\n', '<br />').html_safe_whitelisted_tags

答案 2 :(得分:2)

只需在没有任何方法的情况下使用它,它将呈现为纯文本:

SELECT
    a.id, a.created, a.userid, a.type, a.inviteid,
    b.name_first, b.name_last, b.zip, b.city
FROM
    ext_event_invites i
    LEFT JOIN 
    (
    SELECT
       'CUST' as type,
       a.name_first,
       a.name_last,
       a.zip,
       a.city
    FROM accounts a

    UNION ALL

    SELECT
       'CONT' as type,
       c.name_first,
       c.name_last,
       c.zip,
       c.city
    FROM ext_contacts c
    ) as b ON
       i.inviteid = b.id AND
       i.type = b.type
WHERE
    a.eventid = :eventid AND a.userid = '4711' 
ORDER BY
    b.name_last ASC,
    b.name_first ASC

使用第二个示例,输出将为:

= comment.body

要使foo <iframe>biz</iframe> bar 表现为\n,您可以使用CSS:

<br>

并在您的视图中使用它:

.add-line {
  white-space: pre-wrap;
}

使用你的第一个例子:

.add-line = comment.body

输出将是:

comment.body = "Hello, this is the code: <a href='foo'>foo</a>\n\nBye"