首页 > 解决方案 > MongoDB + PHP:过滤已解析的用户输入是否安全?

问题描述

这是安全的还是容易被用户输入利用?

$ids = explode(",", $_GET['ids']);

$results = $collection->find([
    'arbitraryId' => ['$in' => $ids]
]);

标签: phpmongodbsecurityuser-input

解决方案


在这种特殊情况下,它本身不是易受注入的,但可能会引发错误:

GET /?ids[]=1

此输入将破坏您的第一行代码,因为 PHP 将此类参数视为数组并会尝试对其运行explode(),这会导致

ErrorException: explode() expects parameter 2 to be string, array given

通常的做法是先验证请求并仅在验证成功后继续,否则返回422 unprocessable entity状态。大多数框架都为您提供了方便的工具来轻松完成此任务。为了说明,在 Laravel 中它看起来像这样:

$this->validate($request, [
  'ids' => 'string',
]); 
// quits and returns 422 status automatically on validation failure

推荐阅读