在一个设置页面上,我允许用户编辑一些帐户信息,如电子邮件、姓名、密码等。出于妄想,他们可能会想办法潜入额外的$u post数据以更改其角色或用不必要的添加字段污染其文档,我在$u post数据a上使用数组兴趣键反对我的允许字段白名单。
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个帐户)。
第二,您仍然应该将所有输入作为最佳实践进行转义/验证,特别是在白名单字段中。除了明显的验证(比如确保他们提交了有效的电子邮件/用户名)之外,您还应该始终在网站上转义用户提交的数据。因为您使用的是MongoDB,所以不必担心为了防止数据库注入攻击而进行转义,except in certain uncommon instances。然而,你的未屏蔽数据可能会被用来进行跨站点脚本攻击,允许用户注入恶意的javascript代码,充其量是在你的站点中插入恼人的行为,充其量是窃取用户的密码。
您可以在这里了解更多信息:http://en.wikipedia.org/wiki/Cross-site_scripting
你需要在这里逃走:How to prevent XSS with HTML/PHP?