$_GET absichern - Problem

05/06/2014 18:18 lnqlorlouz#1
Hallo,

und zwar möchte ich meine "Ranking-Liste" mittels $_GET ordnen.
/ranking.php?order=kills&sort=desc
Einmal kann man bei $_GET['order'] entscheiden und einmal bei $_GET['sort'].

Bei $_GET['sort'] ist es mir wichtig, dass man nur asc oder desc eintragen kann. Sonst wäre eine Injection ja möglich...
Habe das vorhin mal mit preg_match probiert, aber ich scheitert irgendwo...Und bei if auch...

PHP Code:
   {
     
$allowed = array('exp''kills''deaths''asc''desc');
    if( 
in_array($_GET['order'],$allowed))
   {
      
$order $_GET['order'];
   }
   else
   {
     echo(
"Something went wrong.");
   }
  } 
Weiß mir einer, wie ich nur bestimme Dinge zulasse die in dem Array stehen? Und falls es anders ist oder gar nichts eingetragen ist soll dort eine Fehlermeldung kommen.
Beispiel:
$sql = "Select * from wraccounts where headshots = $hs order by $order $sort limit $limit,20";
05/06/2014 18:25 Mostey#2
Du solltest dafür lieber einen POST nutzen, wenn du Bedenken hast das da jemand Unfug treiben könnte. Soweit ich informiert bin, werden POST Parameter bei einer SSL Verbindung ebenfalls verschlüsselt.

Ansonsten sollte das mit in_array gehen, hast du mal geprüft ob order überhaupt einen Wert hat?
05/06/2014 18:29 NotEnoughForYou#3
Die einfachste Möglichkeit wäre über real escape strings die Eingaben zu maskieren oder gleich über PDO prepared statements benutzen.

Dein Beispiel funktioniert bei mir
PHP Code:
<?php
$allowed 
= array("test""sth""kill");

if(
in_array($_GET['order'], $allowed)) {
    echo
'erlaubt';
}
else {
    echo
'Fehler';
}

?>
05/06/2014 18:44 pr0Cellarum#4
Der Code funktioniert. Jedoch solltest du a) escapen und b) den Code nochmal überdenken. Momentan würde auch der Parameter 'sort' mit einem String 'kills' validiert werden.

PHP Code:
    // je nach skills direkt prepared statements anschauen
    
$order mysql_real_escape_string($_GET['order']);
    
$sort  mysql_real_escape_string($_GET['sort']);
    
    
$orderWhitelist = array('asc''desc');
    
$sortWhitelist  = array('exp''kills''deaths');

    if(empty(
$order) or !in_array($_GET['order'], $orderWhitelist)) {
        
// set default or print error
    
}

    if(empty(
$sort) or !in_array($_GET['sort'], $sortWhitelist)) {
        
// set default or print error
    
}
    
    
// process 
05/06/2014 18:50 lnqlorlouz#5
Quote:
Originally Posted by NotEnoughForYou View Post
Die einfachste Möglichkeit wäre über real escape strings die Eingaben zu maskieren oder gleich über PDO prepared statements benutzen.

Dein Beispiel funktioniert bei mir
PHP Code:
<?php
$allowed 
= array("test""sth""kill");

if(
in_array($_GET['order'], $allowed)) {
    echo
'erlaubt';
}
else {
    echo
'Fehler';
}

?>
Ja habs grad bemerkt...:facepalm: