jjzjj

php - 将字段名称列入白名单以防止恶意数据操纵?

coder 2023-11-06 原文

在设置页面上,我让用户编辑一些帐户信息,如电子邮件、姓名、密码等。出于偏执,他们可能会想出一种方法来潜入额外的 $_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/

有关php - 将字段名称列入白名单以防止恶意数据操纵?的更多相关文章

  1. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  2. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  3. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用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

  4. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在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中能不能做到类似的简洁?我可以只

  5. ruby-on-rails - 应用程序的名称是否可以作为变量使用? - 2

    当我创建一个Rails应用程序时,控制台:railsnewfoo我的代码可以使用字符串“foo”吗?puts"Yourapp'snameis"+app_name_bar 最佳答案 Rails.application.class将为您提供应用程序的全名(例如YourAppName::Application)。从那里您可以使用Rails.application.class.parent获取模块名称。 关于ruby-on-rails-应用程序的名称是否可以作为变量使用?,我们在StackOve

  6. ruby-on-rails - 如何从过时的 TZInfo 标识符中获取 Rails TimeZone 名称? - 2

    已经有一个问题回答了如何将“America/Los_Angeles”转换为“PacificTime(US&Canada)”。但是我想将“美国/太平洋”和其他过时的时区转换为RailsTimeZone。我无法在图书馆中找到任何可以帮助我完成此任务的东西。 最佳答案 来自RailsActiveSupport::TimeZonedocs:TheversionofTZInfobundledwithActiveSupportonlyincludesthedefinitionsnecessarytosupportthezonesdefinedb

  7. ruby-on-rails - Sphinx - 何时对字段使用 'has' 和 'indexes' - 2

    我几天前在我的ruby​​onrails2.3.2上安装了Sphinx和Thinking-Sphinx,基本搜索效果很好。这意味着,没有任何条件。现在,我想用一些条件过滤搜索。我有公告模型,索引如下所示:define_indexdoindexestitle,:as=>:title,:sortable=>trueindexesdescription,:as=>:description,:sortable=>trueend也许我错了,但我注意到只有当我将:sortable=>true语法添加到这些属性时,我才能将它们用作搜索条件。否则它找不到任何东西。现在,我还在使用acts_as_tag

  8. Ruby - 如何处理子类意外覆盖父类(super class)私有(private)字段的问题? - 2

    假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案

  9. ruby-on-rails - 如何为空白字段编写 rspec? [Rails3.1] - 2

    我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona

  10. ruby - 解释为局部变量会覆盖方法名称吗? - 2

    如thisquestion,当在其自己的赋值中使用未定义的局部变量时,它的计算结果为nil。x=x#=>nil但是当局部变量的名称与现有的方法名称冲突时,就比较棘手了。为什么下面的最后一个示例返回nil?{}.instance_eval{a=keys}#=>[]{}.instance_eval{keys=self.keys}#=>[]{}.instance_eval{keys=keys}#=>nil 最佳答案 在Ruby中,因为可以在没有显式接收器和括号的情况下调用方法,所以在局部变量引用和无接收器无参数方法调用之间存在语法歧义:f

随机推荐