将字段名称列入白名单,以防止恶意数据操作


Whitelisting field names to prevent malicious data manipulation?

在一个设置页面上,我允许用户编辑一些帐户信息,如电子邮件、姓名、密码等。出于担心他们可能会想办法偷偷输入额外的$_post数据来更改他们的角色或用不必要的添加字段污染他们的文档,我在允许字段的白名单中的$_post数据上使用array_enterest_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不易受到大多数在其他数据库上工作的注入攻击,并不意味着插入未经验证的提交数据是个好主意。出于以下几个原因,验证所有字段是一种很好的常见做法。

最重要的是,正如你在问题中暗示的那样,不将某些字段"白名单"将允许恶意用户一次向mongo中插入大量数据。mongo集合中的最大文档大小为16MB。如果不采取措施,攻击者就可以用16MB的插入快速填满硬盘(每GB磁盘空间只需要大约64个帐户)。

其次,您仍然应该将所有输入作为最佳实践进行转义/验证,尤其是在白名单字段中。除了明显的验证之外,比如确保他们提交了有效的电子邮件/用户名,你还应该ALWAY在网站上转义用户提交的数据。因为您使用的是MongoDB,所以您不必担心为了防止数据库注入攻击而进行的转义,除非在某些不常见的情况下。然而,你的未屏蔽数据可能被用来进行跨站点脚本攻击,允许用户注入恶意javascript代码,往好了说,在你的网站中插入令人讨厌的行为,往坏了说,窃取人们的密码。

您可以在此处了解更多信息:http://en.wikipedia.org/wiki/Cross-site_scripting

这里需要做的转义:如何用HTML/PHP防止XSS?