2016-07-07 6 views
0

プレースホルダでプリペアドステートメントを使用すると、クエリのフォーマットが正しくないため、SQLインジェクションから身を守る唯一の方法です。しかし、mysqli_real_escape_stringは安全ではありませんが、変数を一重引用符で囲んで使用すると、であることが多くの人々に示唆されています。例えば(クエリ内の単一引用符に注意してください):シングルクォートのMysqli_real_escape_string - それは安全ですか?

だから、
$value1 = mysqli_real_escape_string($value1); 
$value2 = mysqli_real_escape_string($value2); 
$value3 = mysqli_real_escape_string($value3); 

mysqli_query("INSERT INTO table (column1, column2, column3) 
    VALUES ('" . $value1 . "', '" . $value2 . "', '" . $value3 . "')"; 

のみ整数と文字列を扱う、上記の例では、mysqliのプリペアドステートメントを使用していたかのように同じように安全であろうと、プレースホルダ?

+1

はありません、関係なく、データタイプのあなたが扱っている、_not_プリペアドステートメントを使用しても_never_ますそれらを使用するのと同じくらい安全です。 –

+0

@ Don'tPanic - 私はあなたのロジックに同意したいと思います。あなたが私に指摘できる証拠? –

+1

http://stackoverflow.com/questions/8263371/how-can-prepared-statements-protect-from-sql-injection-attacks –

答えて

3

それは安全ではありませんmysqli_real_escape_stringはありませんが、道のPHPユーザーがそれを使用する傾向があります。

限り、あなたはタイプにもかかわらず、その後、上記技術的に文が安全だろう、常に単一引用符であなたのエスケープ値をラップset_charset()で文字セットを設定しているよう。

しかし、見ることができるように、あまりにも多くのルールがあります。これは、平均的なPHPユーザーにとっては複雑すぎる条件です。したがって、この種の手動書式設定は、注入の無限のソースであるです。なぜなら、任意のルール(エスケープ、引用、文字セットの設定)を適用することを忘れてしまったからです。

さらに、手動でエスケープするとコードが膨大になります。あなたのためにプログラムがあなたのデータを適切に処理するようにしてみませんか?

このため、すべてのルールを自動的に適用するメカニズムが必要です。準備されたステートメントはそのようなメカニズムです。

あなたはそれにあなたのコードを好むしたい何らかの理由で、このような単純な機能と一緒に間違っている:

$sql = "INSERT INTO table (column1, column2, column3) VALUES (?,?,?)"; 
some_query($sql, [$value1,$value2,$value3]); 
関連する問題