2

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

4

1 回答 1

1

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

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

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

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

以及您需要在这里进行的转义:如何使用 HTML/PHP 防止 XSS?

于 2013-09-19T16:26:10.017 回答