2013-05-16 7 views
7

私は、MySQLでOSCommerceを使用するプロジェクトに取り組んでいます。私はtep_db_input()またはtep_db_prepare_input()を使用するべきかについて混乱しています。私は挿入/更新されている任意の文字列の周りにtep_db_input()を使用する必要があると思いますが、他の関数を使用する必要がありますか? Iは、した場合OSCommerce tep_db_input対tep_db_prepare_input

例えば、データベースからいくつかのデータを選択し、その結果を使用するために、次にINSERTは別のテーブルに行、私はいくつかの点で入力を準備する必要がありますか?あるいは、もう一度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)."' 
     )" 
    ); 
} 

これは間違いありませんか?

編集::場合、誰もがそれらの機能に精通していない、ここではそれらの定義は以下のとおりです。

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

答えて

6

tep_db_inputがmysql_real_escape_stringまたはmysql_escape_stringを使用し、それはあなたのデータベースの入力を準備するための推奨方法です。 は(そして、私はmysql_real_escape_stringのは、PHP 5.5.0で始まる廃止されますので、この機能は今後のリリースでmysqli_real_escape_string()または似を使用すると思います。)

どこちょうど脱出んmysql_real_escape_stringのとtep_db_input:

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は、空白を切り取り、角括弧を入れ替えたり、引用符で囲まずに(!)stripslashesを呼び出すなど、さまざまなことを行います。

私のアドバイスは次のようなものです:常にtep_db_inputを使用してください。また、tep_db_prepare_inputを使用して空白などを取り除く場合は、後でtep_db_inputも使用してください。

1

これは少し奇妙ですが、両方を使用しています。このようにすることで、悪意のあるユーザーによる攻撃や、意図しない入力による意図しない問題を防ぐことができます。

HTMLフォームの入力データには、tep_db_prepare入力を使用します。これにより、HTML、魔法の引用符、およびスクリプト注入に関する問題が解消されます。これをデータベースから取得したテキストには使用しないでください。

次に、データベースに書き込む前にtep_db_inputを使用します。これは、SQLインジェクション攻撃などの問題を防ぐために、MySQL文字をエスケープします。ここで

はそれを示したコードサンプルです:

$clean = tep_db_prepare_input($_POST['name']); 
$query_text = tep_db_query("select * from " . TABLE_NAME . " where name='" . tep_db_input($clean) . "'"); 
関連する問題