0

元のコードは次のとおりです。

       if (($handle = fopen($source_file, "r")) !== FALSE) {
    $columns = fgetcsv($handle, $max_line_length, ",");
    foreach ($columns as &$column) {
        $column = str_replace(".","",$column);
    }
    while (($data = fgetcsv($handle, $max_line_length, ",")) !== FALSE) {
        while(count($data) < count($columns)) {
            array_push($data, NULL);
        }
        $c = count($data);
        for($i = 0; $i < $c; $i++) {
            $data[$i] = "'{$data[$i]}'";
        }

        $sql[] = '(' . implode(',', $data) . ", '" . $_POST['custgroup'] . "'," . $_POST['user_id'] . ')';
    }


$query = "INSERT INTO $target_table (" . implode(',', $columns) . 
      ',custgroup,user_id) VALUES ' . implode(',', $sql);


    //mysql_query($query) or trigger_error(mysql_error());
    echo $query;
    fclose($handle);
}

しかし、mysql_real_escape_string を追加すると、次のようになります。

   $query = "INSERT INTO $target_table (" . implode(',',array_map('mysql_real_escape_string', $columns)) . 
          ',custgroup,user_id) VALUES ' . implode(',',array_map('mysql_real_escape_string', $sql));

クエリは次のようになります。

INSERT INTO UserAddedRecord (lastname,firstname,ceLL,fax,email,code,custgroup,user_id) VALUES (\'Last\',\'First\',\'01122331\',\'\',\'abc@hotmail.com\',\'12345\', \'\',17)

php.ini と get_magic_quotes_gpc() を確認しましたが、マジック クォートが無効になっています。

magic_quotes_gpc=オフ

magic_quotes_runtime = オフ

magic_quotes_sybase=オフ

何が問題なのでしょうか?それとも単純に stripslashes() を適用する必要がありますか?しかし、マジック クォートが有効になっている場合にのみ使用されると思います。

4

1 に答える 1

3

あなたは次の線に沿って何かをする必要があります:

  • mysql_real_escape_stringすべての文字列値で使用
  • すべてのinterterを(int)にキャストします
  • その後、周囲の一重引用符を適用します(')

mysql_real_escape_stringのポイントは、テストコンテンツ内の特殊文字をエスケープすることです。これにより、ストリップスラッシュを使用するとそれがなくなります。

これを解決するもう1つの方法はpreparedStatements、クライアント側のエスケープを行う必要がない場所を調べることです。

これを行うことの全体的なポイントは、 SQLインジェクションを防ぎ、それに応じて行動することであることを覚えておいてください:)

于 2011-11-09T09:23:07.337 に答える