如何以安全的方式使用 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
才能正确显示,但在本例中还包含username
和organizationname
,这是输入的内容由用户。那么使用 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 代码将不会被用户浏览器解释。
我想知道什么时候使用 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
才能正确显示,但在本例中还包含username
和organizationname
,这是输入的内容由用户。那么使用 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 代码将不会被用户浏览器解释。