2013-05-16 6 views
7

Pracuję nad projektem, który używa OSCommerce z MySQL i jestem zdezorientowany, kiedy powinienem użyć tep_db_input() lub tep_db_prepare_input(). Zakładam, że powinienem używać tep_db_input() wokół wszelkich ciągów wstawianych/aktualizowanych, ale kiedy należy użyć drugiej funkcji?OSCommerce tep_db_input vs tep_db_prepare_input

Na przykład, gdybym SELECT niektóre dane z bazy danych i użyć wynik następnie INSERT wiersz do innej tabeli, muszę przygotować wejście w pewnym momencie? Lub po prostu ponownie użyć 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)."' 
     )" 
    ); 
} 

Czy to prawda?

Edit :: W przypadku gdy ktoś nie jest zaznajomiony z tymi funkcjami, oto ich definicje:

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

Odpowiedz

6

tep_db_input używa mysql_real_escape_string lub mysql_escape_string i to jest zalecany sposób przygotować wejście bazy danych. (I myślę, że ta funkcja użyje mysqli_real_escape_string() lub podobne w późniejszym wydaniu od mysql_real_escape_string będą nieaktualne począwszy od PHP 5.5.0.)

Gdzie tep_db_input z mysql_real_escape_string właśnie ma ucieczki:

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 robi różne rzeczy, takie jak przycinanie spacji i zastępowanie nawiasów i wypakowywanie (!) przez wywoływanie stripslashes.

Moja rada byłaby następująca: zawsze używaj tep_db_input. A jeśli użyjesz tep_db_prepare_input, aby pozbyć się białych znaków itp., Użyj również tep_db_input.

1

To trochę dziwne, ale używasz obu. Wykonanie tego w ten sposób zapobiegnie atakom złośliwych użytkowników, a także niezamierzonym problemom z nietypowych danych wejściowych.

Użyj danych tep_db_prepare dla dowolnych danych wejściowych z formularza HTML. To usuwa problemy z HTML, magicznymi cytatami i zastrzykami ze skryptów. Nie używaj tego w tekście pobranym z bazy danych.

Następnie należy użyć tep_db_input przed zapisaniem go w bazie danych. Pozwoli to uniknąć znaków MySQL, aby zapobiec atakom SQL injection i innym podobnym problemom.

Oto przykładowy kod, który pokazuje go:

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