2017-09-11 1 views
0

Documentsは本当に唯一の言及:mysqli_prepare()は実際に何をしていますか?なぜそれがユーザによって呼び出され、mysqlite3によって内部的に処理されないのですか?

mysqliのは::準備 - mysqli_prepare - 実行するためのSQLステートメントを準備し

私は実際にボンネットの下に何が起こるか知りたいsql文でmysqli_prepare()を呼び出した後。

誰もがそれを詳述し、なぜそれをスキップできないのでしょうか?これは内部でmysqlite3で実行できませんでしたか?

参考になります。

+2

これは後でバインド変数で埋められるプレースホルダ付きのSQL文を構築するようデータベースに指示します。おそらく[this](http://www.mysqltutorial.org/mysql-prepared-statement.aspx)は –

+0

@MarkBakerありがとう。なぜこの段階が存在するのですか?なぜユーザーの視点からスキップできないのでしょうか?次の質問で質問を編集します。 – Griffin

+0

このドキュメントでは、説明の節でさらに述べています: 'SQLクエリを準備し、ステートメントに対するさらなる操作に使用されるステートメントハンドルを返します。クエリは1つのSQL文で構成されていなければなりません。もしあなたがもっと「もっとうまくいく」ためには、PHPのソースコードを入手しなければなりません。 –

答えて

1

​​とprepare()の違いはprepare()方法を設定して、魔法のあなたはSQLインジェクションのために保存されていることでしょう「secure=true;」のようないくつかの内部フラグを持っているということではありません。実際には、あなたにも、あなたが間違ってそれを使用する場合prepare()でSQLインジェクションを持つことができます。

$stmt = $db->prepare('SELECT password FROM user WHERE username = "'.$username.'"'); 
$stmt->execute(); 
// ... 

を準備文のポイントは、SQLクエリの値/引数/変数は、実際のSQLクエリから送信分離されていることですMySQLサーバに転送します。この方法では、値/引数/変数は送信しようとしているSQLクエリを変更できません。これにより、入力に"='' OR 1 = 1 --"のような値が含まれているSQLインジェクションが防止されます。

準備されたステートメントは、準備されたステートメントの値をbind_param()のような追加のAPI呼び出しで区切って設定するデータ構造を構築しています。 SQLサーバーは "prepared"ステートメントを使用し、bind_param()から受け取った値を使用します。潜在的な危険なデータが読み込まれた最初の値さえも読み取られる前に、クエリは読み込まれ、分析され、うまく「準備され」ています(この準備されたステートメントの期間中)。 WHERE条件を変更または弱めることはできず、別のSQLクエリを追加することも、他の行/列/テーブルを編集することもできます。

このため、コールがないため、コールを内部でprepare()にリダイレクトするだけで安全にすることはできません。つまり、変数やユーザー入力なしで固定のSQLクエリがある場合は​​を使用し、変数やユーザー入力に依存するSQLクエリを持つプリペアドステートメントの場合はprepare()を使用します。

+0

良い点をありがとう。 "この方法では、値/引数/変数は送信しようとしているSQLクエリを変更できません"というのは明確なポイントのようです。 – Griffin

0

非常に短く、すべてが理解できると思いますが、セキュリティ上の理由から準備された文(別名mysqli_prepare)を使用してSQLインジェクションをブロックする必要があります。

+0

OPはあなたが説明したものではなく、それを使用する際にどんな利益があるか)。 – Script47

+0

'mysqli_prepare()'がsqliの注入をブロックすると言うリファレンスを与えることができますか? – Griffin

+0

これはどのように投票されましたか?質問の原点が欠けていますか? – Script47

関連する問題