$ _REQUEST Superglobali okumak için güvenli bir yol nedir?

5 Cevap php

Ben olası güvenlik sorunları kadar açık olmayacak şekilde olsun parametrelerini okumaya çalışıyorum.

Ben ne bekliyoruz açıkça istek parametresi eşleşen ve ardından uymuyor şey için bir varsayılan batıyordu ne düşündüğünü.

Örneğin:

if ($_REQUEST['media'] == "video")
    $sort = "video";
elseif ($_REQUEST['media'] == "audio")
    $sort = "audio";
else
    $sort = "both";

Bu yeterli mi yoksa daha ileri adımlar gereklidir?

5 Cevap

Ne söz güvenli olduğunu, ancak aşırı ayrıntılı değildir. Bir PHP'nin dizi işlemlerini kullanma PHP sizin için kirli işlerini halledeyim olacaktır:

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

Superglobal ayrıştırma bu tür kodunuzu boyunca ortak ise, yapabildin (çok büyük PHP projeler yapmak gibi) bunu sizin için ele bir fonksiyon içine soyut.


Gavin belirtildiği gibi, tüm eğer (yani $_GET, $_POST, ya da $_COOKIE) ilgilendiğiniz belirli superglobali kullanmak da iyi bir fikirdir mümkün. Şimdi önemli görünmüyor olabilir, ama bazı çirkin hatalar çatışmalar üç superglobals (örneğin sort in $_COOKIE arama sonuçlarının varsayılan sıralama başvurabilirsiniz arasında oluşacak adlandırma manefest, ancak sort in $_GET) artan veya azalan düzende ifade eder.

(Eğer iseniz o güvenliğinden endişe) da muhtemelen fazlalaştı bu veri nereden geldiğini bilmiyorum oldukça kötü bir uygulama olduğunu söyledi. Muhtemelen ya teslim yöntemine bağlı olarak $ _GET, $ _POST veya $ _SESSION kullanmalısınız.

Ben bir daha koşulu eklemek istiyorum:

	$sort = "both";
	if (array_key_exists('media', $_REQUEST))
	{
		if ($_REQUEST['media'] == "video")
			$sort = "video";
		elseif ($_REQUEST['media'] == "audio")
			$sort = "audio";
	}

Ve evet, $ _REQUEST süper küresel isteği okumak için önerilen bir yoldur.

Basit şekilde olacaktır:

$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);