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

时间:2013-08-17 05:26:22

标签: php security mongodb

在设置页面上,我允许用户编辑一些帐户信息,如电子邮件,姓名,密码等。出于偏执,他们可能想出一种方法来隐藏额外的$ _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时没有必要。

1 个答案:

答案 0 :(得分:1)

从数据库安全角度来看,您可能可以将用户提交的数据转储到MongoDB中,而无需从POST数据中提取特定字段。但是,仅仅因为MongoDB不容易受到大多数在其他数据库上工作的注入攻击的影响,意味着在没有验证的情况下插入提交的数据是个好主意。由于多种原因,验证所有字段是很常见的做法。

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

其次,您仍应将所有输入转义/验证为最佳做法,尤其是在列入白名单的字段中。除了明显的验证,例如确保他们已经提交了有效的电子邮件/用户名,您应该始终逃避网站上用户提交的数据。因为您使用的是MongoDB,所以您不必担心转义以防止数据库注入攻击,except in certain uncommon instances。但是,您的未转义数据可用于执行跨站点脚本攻击,允许用户注入恶意javascript代码,最多将烦人的行为插入您的站点,最糟糕的是,窃取用户的密码。

您可以在此处了解详情:http://en.wikipedia.org/wiki/Cross-site_scripting

你需要在这里逃避:How to prevent XSS with HTML/PHP?