2009-08-21 9 views
0

Ich versuche zu lesen Parameter erhalten in einer Weise, die nicht mögliche Sicherheitsprobleme zu öffnen.

Was ich dachte, war die Übereinstimmung der Anfrage Parameter explizit, was ich erwarte und dann einen Standard für alles, was nicht übereinstimmt.

Zum Beispiel:

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

Ist das genug oder sind weitere Schritte notwendig?

Antwort

5

Was Sie erwähnen, ist sicher, aber ist zu ausführlich. eines PHP-Array-Operationen mit Hilfe lassen würde PHP die schmutzige Arbeit für Sie erledigen:

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

Wenn diese Art von superglobalen Parsing im gesamten Code üblich ist, könnte man abstrakt diese in eine Funktion, die es für Sie übernimmt (so viele große PHP-Projekte tun).


Wie Gavin erwähnte, es ist auch eine gute Idee, die spezifischen superglobalen zu verwenden, die Sie interessiert sind (das heißt $_GET, $_POST oder $_COOKIE), wenn überhaupt möglich. Es scheint jetzt nicht wichtig zu sein, aber einige hässliche Bugs können durch Benennungskonflikte zwischen den drei Superglobalen entstehen (z. B. sort in $_COOKIE kann sich auf die Standardsortierung der Suchergebnisse beziehen, aber sort in $_GET verweist auf aufsteigende oder absteigende Reihenfolge).

+1

Wirft ein E_NOTICE, wenn kein $ _REQUEST ['media'] gesetzt wurde. Sollte noch isset testen ($ _ REQUEST ['media']). – gnarf

+0

OK. Danke für die Beantwortung der Frage, sowie die Erklärung, warum man $ _GET anstelle von Anfrage verwenden sollte. –

+0

Sehr guter Punkt Gnarf - das hatte ich nicht bedacht. Bearbeitete den ursprünglichen Beitrag, um korrekt zu sein. –

1

würde ich eine weitere Bedingung hinzu:

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

Und ja, das $ _REQUEST Superglobal ist der empfohlene Weg, um die Anforderung zu lesen.

+1

oder 'isset ($ _ REQUEST ['media'])' anstelle von 'array_key_exists 'Auch - warum nicht einfach default $ sort zu" both ", um damit zu beginnen? – gnarf

+0

Gute Idee, verändert! –

+0

Dies ist der lesbarste Weg, also ist es wahrscheinlich die Methode, die ich verwenden werde. –

5

Es ist wahrscheinlich auch erwähnenswert (wenn Sie sich Sorgen um Sicherheit machen), dass es ziemlich schlecht ist, nicht zu wissen, wo Ihre Daten herkommen. Sie sollten wahrscheinlich entweder $ _GET, $ _POST oder $ _SESSION verwenden, abhängig von der Liefermethode.

+0

Guter Fang. Ich dachte mir, jemand würde das bemerken, aber ich war mir nicht sicher, ob es wichtig war. –

1

einfachste Weg wäre:

$sort='both'; 
$sort_valid = array('video', 'audio'); 
if(isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) $sort=$_REQUEST['media']; 
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); 
+0

dort sind schließende Parens) fehlen; Es gibt keine Funktion array_key_intersect() - stattdessen array_intersect_assoc() verwenden; falsch benannt: default! = defaults --- geht davon aus, dass alle Standardeinstellungen bekannt sind (z. B. keine Regex-Regeln möglich) – knb

1

Stellen Sie sicher wissen, wo die Daten kommen, ist die beste Art und Weise.
// haben wir keine GET-Methode akzeptieren, so, wir $ Medien null
gesetzt // if Methode Post gleich, analysieren wir in int, kommt so whateever
$ _POST, in // es wird nicht in String parsen Modus und wir müssen nicht auf SQL-Injection überprüfen.

(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; 
} 



durch die Art und Weise, können Sie über $ _SERVER [ 'REQUEST_METHOD']

// verwenden wir POST-Methode in Form, so lesen ...

if ($ _SERVER ['REQUEST_METHOD'] == "GET") header ('Ort: http://www.disney.com/');