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

ヘックス入力はSQLクエリをサニタイズするのに十分ですか?

    SQLインジェクションが発生する理由を知っていれば、この質問に自分で答えることができます。

    どれどれ。 CWEはSQLインジェクション(CWE-89)について説明しています 次のように:

    さらに:

    つまり、基本的に、生成されたSQLクエリで外部から影響を受けた入力は、意図したとおりに解釈されません。ここで重要なのは、意図したとおりに解釈されないです。 。

    ユーザー入力がMySQL文字列として解釈されることを意図している場合文字列 しかし、そうではありません。SQLインジェクションです。しかし、なぜそれが起こるのですか?

    ええと、文字列リテラル SQLパーサーによって識別される特定の構文があります:

    さらに:

    さらに、文字列リテラル内で引用符を使用できるようにするには:

    これらの後者のシーケンスはすべて文字列リテラルに固有であるため、文字列リテラルとして解釈されることを目的としたデータは、これらのルールに準拠するように適切に処理される必要があります。これは特に意味します。言及された文字のいずれかが文字列リテラルで使用されることを意図している場合、それらは言及された方法の1つとして記述されなければなりません。

    したがって、このように見ると、セキュリティの問題ではなく、単に意図したとおりに解釈されるようにデータを処理するという問題です。 。

    同じことが他のリテラルやSQLの他の側面にも当てはまります。

    では、あなたの質問はどうですか?

    はい、それはSQLインジェクションから安全です。 bin2hex 16進文字のみを含む文字列を返します。また、これらの文字をMySQL文字列リテラルで使用する場合、特別な処理は必要ありません。

    しかし、真剣に、パラメータ化/プリペアドステートメントのような便利なテクニックを提供するライブラリやフレームワークがあるのに、なぜこれらの面倒なフォーマットテクニックを使いたいのでしょうか?



    1. MySQL ODBCはC#.NETプロジェクトで失敗しますが、ランタイムコンパイル済みコードでは失敗しません

    2. MySQLでのmany:many関係のコーディングに関するアドバイスとフィードバックが必要です

    3. 16の異なるクエリ例を使用したMySQLのWHERE条件

    4. 一時テーブルのpostgresqlスレッドセーフ