sql >> データベース >  >> RDS >> Oracle

oci_bind_by_nameはSQLインジェクションを安全に防ぎますか?

    一般的なケースでは、バインドされたパラメータを使用するだけで十分であり、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() )。また、安全でないコンテンツになる可能性があるのはユーザー入力だけではありません。

    私のプレゼンテーションSQLインジェクションの神話と誤謬 も参照してください。 詳細については。




    1. Oracle:サブクエリ内の複数の結果を1つのコンマ区切り値に結合します

    2. MYSQL、PHPはデータベースの複数のテーブルに挿入します

    3. @の後にハイフンが付いたメールアドレスを受け入れないのはなぜですか?

    4. SQL Server(T-SQL)で数値を通貨としてフォーマットする方法