我正在尝试以不会引发潜在安全问题的方式读取获取参数。
我在想的是明确地将请求参数与我期望的匹配,然后为不匹配的任何内容设置默认值。
例如:
if ($_REQUEST['media'] == "video")
$sort = "video";
elseif ($_REQUEST['media'] == "audio")
$sort = "audio";
else
$sort = "both";
这是否足够或需要进一步的步骤?
我正在尝试以不会引发潜在安全问题的方式读取获取参数。
我在想的是明确地将请求参数与我期望的匹配,然后为不匹配的任何内容设置默认值。
例如:
if ($_REQUEST['media'] == "video")
$sort = "video";
elseif ($_REQUEST['media'] == "audio")
$sort = "audio";
else
$sort = "both";
这是否足够或需要进一步的步骤?
你提到的是安全的,但过于冗长。使用 PHP 的数组操作可以让 PHP 为您处理繁琐的工作:
$sort_valid = array('video', 'audio', 'both');
$sort = 'both'
if (isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) {
$sort = $_REQUEST['media'];
}
如果这种超全局解析在您的代码中很常见,您可以将其抽象为一个为您处理它的函数(就像许多大型 PHP 项目所做的那样)。
正如 Gavin 所指出的,如果可能的话,使用您感兴趣的特定超全局变量(即 、 或 )也是一个$_GET
好$_POST
主意$_COOKIE
。现在看起来可能并不重要,但是在三个超全局变量之间会出现命名冲突的一些丑陋的错误(例如sort
,in$_COOKIE
可能指的是搜索结果的默认排序,但sort
in$_GET
指的是升序或降序)。
可能还值得注意(如果您担心安全性),不知道您的数据来自哪里是相当糟糕的做法。您可能应该使用 $_GET、$_POST 或 $_SESSION,具体取决于交付方法。
我还要添加一个条件:
$sort = "both";
if (array_key_exists('media', $_REQUEST))
{
if ($_REQUEST['media'] == "video")
$sort = "video";
elseif ($_REQUEST['media'] == "audio")
$sort = "audio";
}
是的,$_REQUEST 超全局变量是读取请求的推荐方式。
最简单的方法是:
$sort='both';
$sort_valid = array('video', 'audio');
if(isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) $sort=$_REQUEST['media'];
$valid = array("media" => array("both", "media", "video"), ... );
$default = array("media" => "both", ...);
...
// 1. drop invalid keys
$filtered_on_keys = array_key_intersect($_REQUEST, $valid);
// 2. drop invalid values
$filtered_on_values = array();
foreach($filtered_on_keys as $key => $value) {
if (array_search($value, $_REQUEST($key) !== FALSE) {
$filtered_on_values[$key] = $value;
}
}
// 3. add missing defaults
$result = array_merge($defaults, $filtered_on_values);
确保您知道数据来自哪里是最好的方法。
// 我们不接受 GET 方法,所以,我们设置 $media null
// 如果方法等于 post,我们解析成 int,所以无论 $_post 进来什么,
// 它都不会在字符串模式下解析,我们也不需要检查sql注入。
(isset($_GET['media']))? $media='': $media=(int)(isset($_POST['media'])) ? $_POST['media'] : '';
switch ($media) {
case 1: $sort = "video"; break;
case 2: $sort = "audio"; break;
default: $sort = "both"; break;
}
顺便说一句,您可以阅读 $_SERVER['REQUEST_METHOD']
// 我们在表单中使用 POST 方法,所以...
if ($_SERVER['REQUEST_METHOD']=="GET") header('Location: http: //www.disney.com/ ');