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