2013-05-16 11 views
7

Ich arbeite an einem Projekt, das OSCommerce mit MySQL verwendet und ich bin verwirrt, wenn ich tep_db_input() oder tep_db_prepare_input() verwenden sollte. Ich würde annehmen, dass ich tep_db_input() um irgendwelche Zeichenfolgen verwenden sollte, die eingefügt werden/aktualisiert werden, aber dann wann sollte die andere Funktion benutzt werden?OSCommerce tep_db_input vs tep_db_prepare_input

Zum Beispiel, wenn ich bin SELECT einige Daten aus der Datenbank, und verwenden Sie das Ergebnis dann INSERT eine Zeile in einer anderen Tabelle, muß ich den Eingang zu einem bestimmten Zeitpunkt vorzubereiten? Oder benutze einfach noch tep_db_input?

$width = '3"'; // 3 inches 
$new_height = '3\' 5"'; // 3 feet 5 inches 

$result = tep_db_query(
    "SELECT height 
    FROM measurements 
    WHERE width = '".tep_db_input($width)."'" 
); 

while ($row = tep_db_fetch_array($result)) { 
    tep_db_query(
     "INSERT INTO measurement_history (
      field, 
      old_value, 
      new_value 
     ) VALUES (
      'height', 
      '".tep_db_input($row['height'])."', 
      '".tep_db_input($new_height)."' 
     )" 
    ); 
} 

Ist das korrekt?

bearbeiten :: Falls jemand nicht vertraut mit diesen Funktionen ist, hier sind ihre Definitionen:

function tep_sanitize_string($string) { 
    $patterns = array ('/ +/','/[<>]/'); 
    $replace = array (' ', '_'); 
    return preg_replace($patterns, $replace, trim($string)); 
} 

function tep_db_input($string, $link = 'db_link') { 
    global $$link; 

    if (function_exists('mysql_real_escape_string')) { 
     return mysql_real_escape_string($string, $$link); 
    } elseif (function_exists('mysql_escape_string')) { 
     return mysql_escape_string($string); 
    } 

    return addslashes($string); 
} 

function tep_db_prepare_input($string) { 
    if (is_string($string)) { 
     return trim(tep_sanitize_string(stripslashes($string))); 
    } elseif (is_array($string)) { 
     reset($string); 
     while (list($key, $value) = each($string)) { 
      $string[$key] = tep_db_prepare_input($value); 
     } 
     return $string; 
    } else { 
     return $string; 
    } 
} 

Antwort

6

tep_db_input verwendet mysql_real_escape_string oder mysql_escape_string und das ist ein empfohlene Weg, um Ihre Datenbank Eingabe vorzubereiten. (Und ich denke, diese Funktion mysqli_real_escape_string() oder ähnlich in einer späteren Version verwenden, da mysql_real_escape_string mit 5.5.0 PHP Start veraltet wird.)

Wo tep_db_input mit mysql_real_escape_string gerade nicht entkommen:

mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, 
which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a. 

tep_db_prepare_input führt verschiedene Dinge durch wie das Beschneiden von Whitespaces und das Ersetzen von eckigen Klammern und das Unquoting (!) durch Aufrufen von stripslashes.

Also mein Rat wäre: immer tep_db_input verwenden. Und wenn Sie tep_db_prepare_input verwenden, um Whitespace etc. loszuwerden, verwenden Sie auch tep_db_input.

1

Das ist ein bisschen seltsam, aber Sie verwenden beide. Auf diese Weise verhindern Sie Angriffe durch böswillige Benutzer sowie unbeabsichtigte Probleme durch ungewöhnliche Eingaben.

Verwenden Sie die Eingabe von tep_db_prepare für Eingabedaten aus dem HTML-Formular. Dies beseitigt Probleme mit HTML, magischen Anführungszeichen und Skript-Injektionen. Verwenden Sie dies nicht für Text, der von der Datenbank abgerufen wird.

Dann verwenden Sie tep_db_input, bevor Sie es in die Datenbank schreiben. Dies wird den MySQL-Zeichen entkommen, um SQL-Injection-Angriffe und andere derartige Probleme zu verhindern.

Hier ist ein Codebeispiel, das es zeigt:

$clean = tep_db_prepare_input($_POST['name']); 
$query_text = tep_db_query("select * from " . TABLE_NAME . " where name='" . tep_db_input($clean) . "'");