2009-07-16 12 views
1

Ich habe den folgenden Code, der ein "Wort des Tages" präsentiert, Da ich relativ neu zu PHP-Codierung bin, wollte ich sicherstellen, dass es keine Sicherheitsprobleme gab wie ich aus dem Cookie-Wert aus meiner Datenbank auswähle. Vielen Dank.PHP Cookie Sicherheit Frage

if ($word_of_the_day) { 
    $wotd = $wpdb->get_results("SELECT term,definition FROM glossary WHERE term = '{$word_of_the_day}'"); 
    foreach ($wotd as $term) { } 
} 
elseif ($_COOKIE['WOTD']) { 
    $word_of_the_day = htmlspecialchars(addslashes($_COOKIE['WOTD'])); 
    $wotd = $wpdb->get_results("SELECT term,definition FROM glossary WHERE term = '{$word_of_the_day}'"); 
    foreach ($wotd as $term) { } 
} 
else { 
    $wotd = $wpdb->get_results("SELECT term,definition FROM glossary ORDER BY RAND() LIMIT 1"); 
    foreach ($wotd as $term) { 
     setcookie("WOTD", $term->term, time()+86400); 
    } 
} 

Antwort

4

Nun, wenn $ word_for_the_day von Benutzereingaben kommt, gibt es Ihr erstes Problem. Tun Sie dies, bevor Sie es verwenden:

$word_for_the_day = mysql_real_escape_string($word_for_the_day); 

Ihr Cookie eigentlich OK aussieht. Die Aufrufe von htmlspecialchars() und addslashes() erscheinen in dem Kontext, in dem Sie sie verwenden, nicht anfällig für SQL-Injection- oder XSS-Angriffe.

1

Sie sollten überprüfen mysql_real_escape_string: „Maskiert spezielles Zeichen in einer Zeichenfolge für die Verwendung in einer SQL-Anweisung“. Sie müssen die Sachen, die Sie machen, nicht manuell mit htmlspecialchars und addslashes erledigen. Kennen Sie sich mit SQL injection Sicherheitsrisiken? Wenn die Variable, die Sie in die SELECT-Anweisung, $word_of_the_day, einbinden, vom Benutzer stammt, liegt ein potenzielles SQL-Injection-Problem vor.

0

Woher kommt $ word_of_the_day? Wenn es von Benutzereingaben kommt, sind Sie offen für SQL-Injection.

1

addslashes ist extrem schwach. Als Erstes führen Sie alles, was Sie von der Datenbank abfragen, durch mysql_escape_string aus, um eine SQL-Injektion zu verhindern. Das sind nur die Grundlagen.

if($word_of_the_day){ 

$word_of_the_day = mysql_escape_string($word_of_the_day); 
$wotd = $wpdb->get_results ("SELECT term,definition FROM glossary WHERE term = '{$word_of_the_day}'"); 

Auch sind Cookies im Allgemeinen nicht sehr sicher, egal wie sicher Code Sie schreiben. Für eine viel sicherere Lösung empfehle ich, PHP-Sitzungen ($ _SESSION) zu verwenden. Sie können Variablen in dieser superglobalen Variablen speichern und sie bleibt zwischen den Seitenladungen erhalten.

http://www.php.net/manual/en/session.examples.basic.php

Danach möchten Sie möglicherweise gegen Session Hijacking oder Vergiftung schützen, wenn Sie wirklich für sie

1

Eine weitere Option gehen Sie wäre in Erwägung ziehen könnte die ID des Wortes zu speichern, statt des Wortes selbst im Cookie. So kann es immer nur eine ganze Zahl sein. Natürlich ist die Verwendung des Wortes auch in Ordnung, solange Sie zuerst mysql_real_escape_string, ich wollte nur eine andere Option anbieten.

1

Eine der sichersten Möglichkeiten, um die PDO MySQL Funktionen zu verwenden, die Parameter implementiert:

$db = new PDO('mysql:host=hostname;dbname=defaultDbName', 'username', 'password'); 
$stmt = $db->prepare('SELECT term,definition FROM glossary WHERE term = :wotd'); 
if ($stmt) { 
    if ($stmt->execute(array(':wotd' => $word_of_the_day))) { //This is safe for any input method 
     $info = $stmt->fetchAll(); 
     foreach($info as $row) { 
      //Whatever 
     } 
    } 
} 

Die PDO-Treiber funktionieren die richtige escaping/zitiert nach dem Datentyp in der Tabelle.