一般的なケースでは、バインドされたパラメータを使用するだけで十分であり、SQLインジェクションを回避するための優れた方法です。
ただし、プリペアドステートメントのパラメータは値にのみ使用できます。 SQL式で。言い換えると、通常、引用符で囲まれた文字列リテラル、引用符で囲まれた日付リテラル、または数値リテラルを記述します。そして、1つのパラメータ==1つの値(リストなし)。
これらの場合は、バインドされたパラメータを使用する必要があります。 バインドされたパラメータが不十分であると誰かが答えた場合、バインドされたパラメータの使用をスキップしたいと思うためにこの質問をしている場合は、申し訳ありませんが、安全なプログラミング手法から免除されることはありません。
ただし、バインドされたパラメーターが機能しない他の(おそらくあまり一般的ではない)ケースがあります。動的なテーブル名、列名、その他の識別子、式全体、またはSQLキーワードを使用してクエリを作成する必要がある場合は、別のメソッドが必要です。これらのケースは、SQL構文の prepareで修正する必要があります。 時間なので、パラメータ化することはできません。
たとえば、変数を使用して示される動的な部分を含むクエリを次に示します。これはパラメータにすることはできません。
$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc";
これらのケースにはホワイトリストを使用する必要があります 。つまり、動的テーブル名としてクエリに補間する文字列が、実際にはデータベースに存在するテーブルの1つであることを確認してください。 SQLキーワードが正当なキーワードであることを確認してください。
決して ユーザー入力を逐語的に受け取り、SQL(またはeval()
に入力する引数など、実行時に解析されるその他のコードに補間します。 またはshellexec()
)。また、安全でないコンテンツになる可能性があるのはユーザー入力だけではありません。
私のプレゼンテーション