在设置页面上,我让用户编辑一些帐户信息,如电子邮件、姓名、密码等。出于偏执,他们可能会想出一种方法来潜入额外的 $_post 数据来改变他们的角色或用不必要的添加污染他们的文档字段,我在 $_post 数据上使用 array_interest_keys 来对照我的允许字段白名单。
protected $user_settings_fields = array(
'email' => '',
'password' => '',
'name' => '',
);
public function edit_settings( array $data )
{
$data = array_intersect_key($data, $this->user_settings_fields);
// Do stuff like check $data['_id'] against auth_user['_id']
// to make make sure the user is updating their own document.
// Perform update
}
这是好的、普遍的做法还是矫枉过正?我已经采取了其他预防措施,例如转义表单输出数据,即使一个伙伴告诉我在使用 MongoDB 时没有必要这样做。
最佳答案
从数据库安全的角度来看,您可以将用户提交的数据转储到 MongoDB 而无需从其 POST 数据中提取特定字段。然而,仅仅因为 MongoDB 不易受到大多数适用于其他数据库的注入(inject)攻击的影响,不就意味着在没有验证的情况下插入提交的数据是个好主意。出于多种原因,验证所有字段是一种很好的常见做法。
最重要的是,正如您在问题中暗示的那样,不将某些字段“列入白名单”将允许恶意用户一次将大量数据插入 mongo。 mongo 集合中的最大文档大小为 16MB。如果不对此采取措施,攻击者可以使用 16MB 的插入快速填满您的硬盘(每 GB 磁盘空间仅需要约 64 个帐户)。
其次,作为最佳实践,您仍应转义/验证所有输入,尤其是在白名单字段中。除了明显的验证(例如确保他们提交了有效的电子邮件/用户名)之外,您还应该始终在网站上转义用户提交的数据。因为你用的是MongoDB,所以不用担心转义,防止数据库注入(inject)攻击,except in certain uncommon instances .但是,您未转义的数据可能会被用来进行跨站点脚本攻击,从而允许用户注入(inject)恶意 javascript 代码,最好的情况是在您的站点中插入烦人的行为,最坏的情况是窃取人们的密码。
您可以在此处了解更多相关信息:http://en.wikipedia.org/wiki/Cross-site_scripting
以及您需要在此处执行的转义:How to prevent XSS with HTML/PHP?
关于php - 将字段名称列入白名单以防止恶意数据操纵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18285452/
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
当我创建一个Rails应用程序时,控制台:railsnewfoo我的代码可以使用字符串“foo”吗?puts"Yourapp'snameis"+app_name_bar 最佳答案 Rails.application.class将为您提供应用程序的全名(例如YourAppName::Application)。从那里您可以使用Rails.application.class.parent获取模块名称。 关于ruby-on-rails-应用程序的名称是否可以作为变量使用?,我们在StackOve
已经有一个问题回答了如何将“America/Los_Angeles”转换为“PacificTime(US&Canada)”。但是我想将“美国/太平洋”和其他过时的时区转换为RailsTimeZone。我无法在图书馆中找到任何可以帮助我完成此任务的东西。 最佳答案 来自RailsActiveSupport::TimeZonedocs:TheversionofTZInfobundledwithActiveSupportonlyincludesthedefinitionsnecessarytosupportthezonesdefinedb
我几天前在我的rubyonrails2.3.2上安装了Sphinx和Thinking-Sphinx,基本搜索效果很好。这意味着,没有任何条件。现在,我想用一些条件过滤搜索。我有公告模型,索引如下所示:define_indexdoindexestitle,:as=>:title,:sortable=>trueindexesdescription,:as=>:description,:sortable=>trueend也许我错了,但我注意到只有当我将:sortable=>true语法添加到这些属性时,我才能将它们用作搜索条件。否则它找不到任何东西。现在,我还在使用acts_as_tag
假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案
我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona
如thisquestion,当在其自己的赋值中使用未定义的局部变量时,它的计算结果为nil。x=x#=>nil但是当局部变量的名称与现有的方法名称冲突时,就比较棘手了。为什么下面的最后一个示例返回nil?{}.instance_eval{a=keys}#=>[]{}.instance_eval{keys=self.keys}#=>[]{}.instance_eval{keys=keys}#=>nil 最佳答案 在Ruby中,因为可以在没有显式接收器和括号的情况下调用方法,所以在局部变量引用和无接收器无参数方法调用之间存在语法歧义:f