我想读取参数的方式,不会打开潜在的安全问题。
我在想的是明确地将request参数与我期望的相匹配,然后为任何不匹配的内容设置默认值。
例如:
if ($_REQUEST['media'] == "video")
$sort = "video";
elseif ($_REQUEST['media'] == "audio")
$sort = "audio";
else
$sort = "both";
难道这还不够或有必要的进一步措施?
我想读取参数的方式,不会打开潜在的安全问题。
我在想的是明确地将request参数与我期望的相匹配,然后为任何不匹配的内容设置默认值。
例如:
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项目)。
由于加文指出,它也可以使用您所感兴趣的特定超全局是一个好主意(即$_GET
,$_POST
,或$_COOKIE
)如果可能的话。它现在看起来可能并不重要,但是一些丑陋的错误可能会导致命名冲突发生在三个超级全局变量之间(例如sort
,$_COOKIE
可能指的是搜索结果的默认排序,但$_GET
中的sort
指的是升序或降序)。
我想补充一个条件:
$sort = "both";
if (array_key_exists('media', $_REQUEST))
{
if ($_REQUEST['media'] == "video")
$sort = "video";
elseif ($_REQUEST['media'] == "audio")
$sort = "audio";
}
是的,在$ _REQUEST超全局是读取请求的推荐方式。
或'isset($ _REQUEST ['media'])''而不是'array_key_exists'此外 - 为什么不只是默认$排序到“两个”开始? – gnarf 2009-08-21 21:08:51
好主意,改变了! – 2009-08-21 21:10:38
这是最可读的方式,所以它可能是我将要使用的方法。 – 2009-08-21 23:02:55
它可能也值得注意(如果你关心安全性),不知道你的数据来自哪里是相当糟糕的做法。您应该根据交付方式使用$ _GET,$ _POST或$ _SESSION。
好的。我想有人会注意到,但我不确定它是否重要。 – 2009-08-21 22:56:51
简单的方法是:
$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);
有关闭的人)失踪;没有函数array_key_intersect() - 使用array_intersect_assoc()来代替; misnamed:default!= defaults ---假定所有默认值都是已知的(例如,没有正则表达式规则) – knb 2010-11-26 15:17:56
确保您知道数据的来源是最好的方式。
//我们鸵鸟政策接受GET方法,因此,我们设定$媒体空
//如果equals方法后,我们解析成int型,因而whateever进来$ _ 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/');
如果没有设置$ _REQUEST ['media'],则会引发E_NOTICE。还是应该测试isset($ _REQUEST ['media'])。 – gnarf 2009-08-21 21:57:34
好的。感谢您回答这个问题,以及为什么要使用$ _GET而不是请求的解释。 – 2009-08-21 22:55:32
非常好的一点Gnarf - 我没有考虑过。编辑原文是正确的。 – 2009-08-22 02:01:20