如何以安全的方式使用 html_safe?

How to use html_safe in a secure manner?

我想知道什么时候使用 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 message,需要html_safe才能正确显示,但在本例中还包含usernameorganizationname,这是输入的内容由用户。那么使用 html_safe... 仍然安全吗?

如果您将用户内容注入到使用 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

一般来说,它不是,恶意用户可能会输入一些有害的 js 代码作为他的 organizationname,并且此代码会成为您应用程序的一部分 - 您不希望这样。这种攻击称为跨站点脚本 (XSS),您可以在此处阅读相关信息: http://www.jasonwieringa.com/Learning-About-XSS-Attacks-in-Rails/

正如 axel 指出的那样,您应该在每个要标记为 html_safe 的用户输入上调用 sanitize 它所做的是将所有 html 特殊字符替换为实体,因此任何不需要的标记或 js 代码将不会被用户浏览器解释。