什么是读取PHP $ _REQUEST超全局的安全方法?

Jef*_*vis 0 php security superglobals

我试图以不会打开潜在安全问题的方式读取get参数.

我在想的是将请求参数明确地与我期望的匹配,然后为任何不匹配的东西设置默认值.

例如:

if ($_REQUEST['media'] == "video")
    $sort = "video";
elseif ($_REQUEST['media'] == "audio")
    $sort = "audio";
else
    $sort = "both";
Run Code Online (Sandbox Code Playgroud)

这还不够或需要进一步的步骤吗?

Mic*_*val 5

你提到的是安全的,但过于冗长.使用PHP的数组操作可以让PHP为您处理脏工作:

$sort_valid = array('video', 'audio', 'both');
$sort = 'both'
if (isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) {
    $sort = $_REQUEST['media'];
}
Run Code Online (Sandbox Code Playgroud)

如果这种超全局解析在整个代码中很常见,那么您可以将它抽象为一个为您处理它的函数(就像许多大型PHP项目一样).


正如加文指出,它也可以使用您所感兴趣的特定超全局是一个好主意(即$_GET,$_POST$_COOKIE)如果可能的话.这可能似乎并不重要了,但一些丑陋的虫子可以从命名冲突manefest三个超全局变量之间会发生(例如,sort$_COOKIE可参考的搜索结果的默认排序,但sort$_GET指升序或降序).


Gav*_*our 5

可能还值得注意的是(如果你担心安全性),不知道你的数据来自哪里是相当不好的做法.您应该使用$ _GET,$ _POST或$ _SESSION,具体取决于交付方式.