我试图以一种不会打开潜在安全问题的方式阅读获取参数。
我在想的是明确地将请求参数与我期望的匹配,然后为任何不匹配的东西设置默认值。
例如:
if ($_REQUEST['media'] == "video")
$sort = "video";
elseif ($_REQUEST['media'] == "audio")
$sort = "audio";
else
$sort = "both";
这是否足够或需要进一步的步骤?
答案 0 :(得分:5)
你提到的是安全的,但是过于冗长。使用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
中的$_COOKIE
可能会引用搜索结果的默认排序,但是{{1} } sort
中指的是升序或降序。)
答案 1 :(得分:5)
可能还值得注意的是(如果您担心安全性),不知道数据来自何处是相当不好的做法。您应该使用$ _GET,$ _POST或$ _SESSION,具体取决于交付方式。
答案 2 :(得分:1)
我会再增加一个条件:
$sort = "both";
if (array_key_exists('media', $_REQUEST))
{
if ($_REQUEST['media'] == "video")
$sort = "video";
elseif ($_REQUEST['media'] == "audio")
$sort = "audio";
}
是的,$ _REQUEST超全球是推荐阅读请求的方式。
答案 3 :(得分:1)
最简单的方法是:
$sort='both';
$sort_valid = array('video', 'audio');
if(isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) $sort=$_REQUEST['media'];
答案 4 :(得分:1)
$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);
答案 5 :(得分:1)
确保您知道数据的来源是最佳方式
//我们不接受GET方法,因此,我们设置$ media null
//如果方法等于post,我们解析成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”)标题('Location:http://www.disney.com/');