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

mysqlのプリペアドステートメントを使用する方が、一般的なエスケープ関数を使用するよりも安全なのはなぜですか?

    ここにいる人々が見逃していると思う重要な点は、パラメーター化されたクエリをサポートするデータベースでは、心配する必要のある「エスケープ」がないということです。データベースエンジンは、バインドされた変数をSQLステートメントに結合してから、すべてを解析しません。バインドされた変数は個別に保持され、一般的なSQLステートメントとして解析されることはありません。

    それがセキュリティとスピードの源です。データベースエンジンは、プレースホルダーにデータのみが含まれていることを認識しているため、完全なSQLステートメントとして解析されることはありません。ステートメントを一度作成してから何度も実行すると、スピードアップが実現します。正規の例は、同じテーブルに複数のレコードを挿入することです。この場合、データベースエンジンは、解析、最適化などを1回だけ行う必要があります。

    さて、1つの落とし穴はデータベース抽象化ライブラリです。バインドされた変数を適切なエスケープを使用してSQLステートメントに挿入するだけで偽造されることがあります。それでも、それは自分でやるよりはましです。



    1. MariaDBでのCONVERT()のしくみ

    2. AmazonRDSからCSVファイルへのテーブルのエクスポート

    3. OracleのNLS_NCHAR_CHARACTERSETとNLS_CHARACTERSETの違い

    4. SQL Server SHOWPLAN_TEXT