2016-08-21 8 views
1

この質問(Should I use bindValue() or execute(array()) to avoid SQL injection?)を読んで、実行時にarray()とbindParam PDOと準備されたステートメント。PDOプリペアドステートメントの場合はbindParam()、bindValue()、execute()を使用する必要がありますか?

しかし、私はexecute()が整数であるかどうかに関わらず、すべての変数を自動的に文字列として扱うということを思い出しています。私の質問は確かにこれは文字列変数以外のセキュリティ問題ですか?

たとえば、準備されたクエリを使用して1のユーザーIDを取得する場合、実行されたパラメータは整数ではなく文字列として扱われます。

私はので、私は完全に書く方法を理解しようとしているPDOを勉強しています明らかに、このスクリプトは、ユーザー入力のない方法を持っていないだろう、とだけ、このようなプロファイルを更新するなど、ユーザーの入力をサポートします、ポストなど

SQLインジェクションやその他のセキュリティ上の欠陥を防ぐ/防御しているPDOクエリ(またはより優れた機能)を安全に保護します。

ありがとう

+0

あなたが探しているものなら、bindParamでパラメータの型を強制することができます。 http://php.net/manual/en/pdostatement.bindparam.php http://php.net/manual/en/pdo.constants.php – Linesofcode

+0

また、PDOStatement :: bindValueを使用して行うこともできます。 http://php.net/manual/en/pdostatement.bindvalue.php –

答えて

1

セキュリティが賢明であるため、execute()にパラメータを送信することには1つの問題はありません。だから、あなたの心配は余分です。与えられた文字列が安全に扱われ、すべてのパラメータを文字列として送信しているので、すべてのパラメータが安全に扱われると論理的に結論づけることができます(私はあなたの質問を非難するわけではありません。 。

すべてのパラメータを文字列として扱う唯一の問題は、データベースサーバー側で発生する可能性があります。しかし、ほとんどのデータベースサーバーでは、SQLで緩やかな型指定が可能です。つまり、文字列として送信されても​​、データリテラルが正しく認識されて処理されることを意味します。それがうまくいかない場合のエッジケースはごくわずかです。ここに私のPDO tutorialからの抜粋があります。

ただし、データ型を明示的に設定する方がよい場合もあります。 可能な例は、以下のとおりです。エミュレーションモードまたは単なる文字列オペランドを受け入れることができない、他のSQL句で

  • LIMIT句。間違ったオペランドの型に拘束されることに正確な型のオペランドを必要とBIGINTBOOLEANよう
  • 特有の列型を、(影響を受ける可能性がある非自明なクエリプランと
  • 複雑なクエリためにBIGINTをバインドすることに注意してください 値はPDO :: PARAM_INTで、mysqlndベースの インストールが必要です)。すでにエミュレーションをオフになって、あなたはexecute()メソッドほぼすべての時間を使用することができます与えられた結論として

関連する問題