我想讀取參數的方式,不會打開潛在的安全問題。
我在想的是明確地將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