the*_*man 1 ruby security xss ruby-on-rails ruby-on-rails-4
xss_sanatised在保存到数据库之前,我有一个处于模型级别的字段。当我希望显示它时,是否应该escape_javascript在视图中呈现之前再次显示它?
我的查询应该像
User.all.pluck(:id, :name).map { id: id, name: escape_javascipt(name)}
代替
User.all.pluck(:id, :name).map { id: id, name: name }
当我直接注入<script>alert('hi')</script>数据库时,它实际上在UI中执行。尽管如果不直接编写SQL查询就无法将该值写入数据库。
那我应该escape_javascript用于所有领域吗?
编辑
使用select2在UI中将其呈现为下拉列表
<div input="hidden" id="input"></div>
jQuery('#input').select2({
multiple: false,
data: <%=tech.to_json.html_safe%>,
initSelection : function (element, callback) {
callback(<%= esc.to_json.html_safe %>);
}
});
Run Code Online (Sandbox Code Playgroud)
我认为您在这里感到困惑的原因仅仅是因为您通过直接写入数据库来绕过自己应用程序的卫生规则。
默认情况下,您永远不要“信任”用户输入。应始终将其视为潜在恶意软件。
您选择信任它的原因之一是它是否由内部用户(例如您自己!)提供。
或者,您可能选择信任它的另一个原因是,如果在保留之前对其进行了消毒 -即您已明确阻止了任何潜在的恶意输入。
假设您的xss_sanatised输入是安全的(由于您没有共享代码,我无法确认),那么您可以相信用户输入是安全的。因此,直接在浏览器中显示是可以的。
但是,如果通过“直接编写SQL查询”来强制将不安全的输入手动输入数据库,则上述“输入是安全的”假设自然就无效了。但这是“不可能”的情况,所以我不必特别担心。
如果您真的想对此加倍安全,则可以在呈现之前重新清理输入。但是,我认为这很可能是矫kill过正。(无论哪种方式,您都只需将其消毒一次!)
escape_javascript是一种单独的方法,与用户输入的卫生处理无关。这与您正在描述的问题无关。
如果您需要调用escape_javascript一个值,那就去找它。但是同样,由于您没有共享视图渲染代码,因此我无法建议您是否真正需要它。