如果您要將 $_GET
(或 $_POST
)參數傳遞到您的查詢,請確保先將它們轉換為字串。使用者可以在 GET 和 POST 請求中插入關聯陣列,這可能會變成不需要的 $- 查詢。
一個相當無害的例子:假設您正在使用請求 *http://www.example.com?username=bob* 查詢使用者的資訊。您的應用程式建立了查詢 $q = new \MongoDB\Driver\Query( [ 'username' => $_GET['username'] ])
。
有人可能會透過取得 *http://www.example.com?username[$ne]=foo* 來破壞這個查詢,PHP 會神奇地將其轉換為關聯陣列,將您的查詢變成 $q = new \MongoDB\Driver\Query( [ 'username' => [ '$ne' => 'foo' ] ] )
,這將會返回所有名稱不是「foo」的使用者(可能是您的所有使用者)。
這種攻擊很容易防禦:在將 $_GET 和 $_POST 參數傳送到資料庫之前,請確保它們是您預期的類型。PHP 提供了 filter_var() 函式來協助完成此操作。
請注意,這種類型的攻擊可以用於任何定位文件的資料庫互動,包括更新、向上插入、刪除和 findAndModify 命令。
有關 MongoDB 中類似 SQL 注入問題的更多資訊,請參閱» 主要文件。