2012-01-16 7 views
7

PHPドキュメントPDOによる::準備()すべてのパラメータに引用符を追加します。はPDOによって追加の引用符の扱い::(準備)

"プリペアドステートメントのパラメータはクォートする必要はなく、ドライバは自動的にこれを処理します。アプリケーションがプリペアドステートメントを排他的に使用する場合、開発者はSQLインジェクションが発生しないことを確認できます(ただし、エスケープされていない入力でビルドされても、SQLインジェクションは可能です)。

この問題は、私のクエリとデータベース構造を構築する方法です。通常、SQL文のFROM部分は、おそらく直接ユーザー入力によって定義されるため、パラメータ化する必要はありません。しかし、私のコードでは、いくつかの場所で大文字と小文字が区別されるので、パラメータ化されたバージョンではより快適になります。テーブル名FROM SELECT *とは対照的に、

SELECT * FROM ? WHERE ?=? 

WHERE?=?

私の質問は、これは私の顔にスローされたSQLエラーを取得しないように私のPDOオブジェクトがFROMパラメータの周りに引用符を追加するのを防ぐことは可能ですか?それとも別のやり方でこれをしなければならないのですか?

+2

正確に何が問題なのですか? – jeroen

+0

必ずしも引用符を付けるわけではありません。ネイティブのプリペアドステートメントをサポートするドライバはリテラル '?'を保持し、データベースサーバはその置換を行います。 - しかし、具体的にあなたのコードが何をしているのか、なぜそれが問題なのかを説明する必要があります。あなたのFROM句に ''?''や ':placeholder''を加えることは、文字列であり、束縛されたパラメータではありません。 – mario

+0

ご迷惑をおかけして申し訳ありませんが、入力を終了する前に私は間違って入力しました – hamalnamal

答えて

4

プリペアドステートメントのプレースホルダは値のみです。動的テーブル名を挿入する唯一の方法は、自分で行うことです。

"SELECT FROM `".$table."` WHERE `".$column."` = ?" 
+3

もちろん、バックティックで値をラップするだけでは、変数の内容が汚染されたソースから来た場合は安全ではありません。 – Matthew

+0

@YourCommonSense _table_と_column_の名前がコントロールのソースから来たユースケースを教えてもらえますか?彼らが何らかの理由でユーザーの入力を基にしている場合、DBパスワードを与えるのがずっと簡単です。これは、信頼できるソース(例えば、設定や他のどこかでハードコードされているもの)から来ていると仮定したり、間違ったことをしたりしている可能性があります。そして、それでもあなたの脳を使用することを妨げていません:) – KingCrunch

+0

格安話、おい。 –

2

@KingCrunchは彼の答えではほとんど正しいです。あなたは本当に自分自身で文字列をエスケープする必要があります。このようなものは、ほとんどの注射から保護する必要があります:

//make sure $table and $column only contain alphanumeric chars 
$table = preg_replace("/[^A-Za-z0-9]/", '', $table); 
$column = preg_replace("/[^A-Za-z0-9]/", '', $column); 

$query = "SELECT FROM `{$table}` WHERE `{$column}` = ?" 
関連する問題