我的应用程序中有注释部分,用户在文本区域中输入输入。我想阻止他们输入的换行符,但也将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
我应该怎样做才能达到我的目的?
答案 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"