我想知道何时使用html_safe
是安全的,何时不安全。我知道如果代码可能包含用户内容,则不希望这样做。这在实践中意味着什么?
flash[:danger]="Dear #{@user.username} <br> please take a look #{view_context.link_to('here', some_path)}" <br> Your organization #{@user.organizationname} bla bla"
例如,对于此类Flash消息,需要html_safe
才能正确显示,但在这种情况下它还包含username
和organizationname
,这是由用户。那么使用html_safe
......是否仍然安全?
答案 0 :(得分:3)
如果您将用户内容注入使用html_safe呈现的字符串中,则必须确保所有注入的内容均为sanitized
flash[:danger]="Dear #{ActionController::Base.helpers.sanitize @user.username} <br> please take a look #{view_context.link_to('here', some_path)}" <br> Your organization #{ActionController::Base.helpers.sanitize @user.organizationname} bla bla"
http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html
答案 1 :(得分:1)
一般来说,不是,恶意用户可以输入一些有害的js代码作为他的organizationname
,而且这段代码不会成为你应用的一部分 - 你不想要这个。此攻击称为跨站点脚本(XSS),您可以阅读它,即:
http://www.jasonwieringa.com/Learning-About-XSS-Attacks-in-Rails/
正如Axel指出的那样,你应该在每个要标记为sanitize
的用户输入上调用html_safe
它所做的是将所有html特殊字符替换为实体,因此任何不需要的标记或js代码都将不能被用户浏览器解释。