Mysql_real_escape_string()を回避するSQLインジェクションweb-dev-qa-db-ja.com/home/日本語/php/Mysql_real_escape_string()を回避するSQLインジェクションMysql_real_escape_string()を回避するSQLインジェクションmysql_real_escape_string()関数を使ってもSQLインジェクションの可能性はありますか?このサンプル状況を検討してください。SQLは以下のようにPHPに構築されます。password='$password'";私は、そのようなコードはまだ危険であり、mysql_real_escape_string()関数を使用してもハッキングする可能性があると多くの人が私に言うのを聞いたことがあります。Knop次のようなクエリを考えます。$iId";mysql_real_escape_string()はこれに対してあなたを守りません。')を使用しているという事実が、これに対してあなたを保護しています。以下もオプションです。Opdorp短い答えははい、はい、mysql_real_escape_string()を回避する方法があります。非常に不明瞭なエッジケースの場合!!!長い答えはそれほど簡単ではありません。1");特定の状況では、それは複数の行を返します。gbk');この攻撃が機能するためには、接続でサーバーが期待するエンコードが必要です。エンコードはASCIIのように'をエンコードする必要があります。5.6ではデフォルトで、big5、cp932、gb2312、gbkおよびsjisという5つのエンコーディングがサポートされています。ここでgbkを選択します。NAMESの使用に注意することが非常に重要です。これにより、文字セットサーバー上が設定されます。API関数mysql_set_charset()の呼び出しを使用した場合、問題ありません(2006年以降のMySQLリリース)。その理由についてはあと1分で...ペイロードこのインジェクションに使用するペイロードは、バイトシーケンス0xbf27で始まります。gbkでは、これは無効なマルチバイト文字です。latin1では、文字列¿'です。latin1andgbkでは、0x27自体が'文字であることに注意してください。0x5c、つまり'を挿入するためです。そこで、gbkの2文字のシーケンスである0xbf5c27を作成しました:0xbf5cの後に0x27が続きます。言い換えると、valid文字の後にエスケープされていない'が続きます。addslashes()は使用していません。API呼び出しは、接続文字セットを知っているという点でaddslashes()と異なります。そのため、サーバーが予期している文字セットに対して適切にエスケープを実行できます。この時点まで、クライアントは接続にlatin1を使用していると考えています。serverにgbkを使用していると伝えましたが、clientはまだlatin1であると考えています。したがって、mysql_real_escape_string()を呼び出すとバック​​スラッシュが挿入され、「エスケープ」されたコンテンツに'文字がぶら下がります!実際、gbk文字セットの$varを見ると、次のように表示されます。クエリこの部分は単なる形式ですが、レンダリングされたクエリは次のとおりです。1おめでとうございます、あなたはmysql_real_escape_string()を使用してプログラムを攻撃することに成功しました...悪い人ひどくなる。PDOのデフォルトは、MySQLで準備されたステートメントをemulatingにします。クライアント側では、基本的に(Cライブラリ内の)mysql_real_escape_string()を介してsprintfを実行します。次のようにするとインジェクションが成功します。false);これにより、通常の結果、真の準備済みステートメント(つまり、クエリとは別のパケットでデータが送信されます)になります。適切なものを選択するように注意してくださいサーバーのバージョン)。gbkの代わりにmysql_set_charset('gbk')を使用していた場合、これをすべて防止できたと言いました。2006年以降、MySQLのリリースを使用している場合、それは事実です。ペイロード内の文字などの無効なマルチバイト文字が、クライアントがエスケープしても1バイトとして扱われることを意味しました接続エンコーディングが正しく通知されていたため、この攻撃は引き続き成功します。APIを公開しなかったため、以前のバージョンではcannot考えられるすべてのコマンドに対してこの攻撃を防ぎます。して公開されています。救いの恵み最初に述べたように、この攻撃が機能するには、脆弱な文字セットを使用してデータベース接続をエンコードする必要があります。脆弱ではないでありながら、すべてのUnicode文字をサポートできます。5.5.3以降でのみ利用可能です。SQLモードを有効にすることができます。これにより、(特に)mysql_real_escape_string()の操作が変更されます。このモードを有効にすると、0x27は0x2727ではなく0x5c27に置き換えられるため、エスケーププロセスcannotは、以前に存在しなかった脆弱なエンコーディングで有効な文字を作成します(つまり0xbf27はまだ0xbf27など)-サーバーは引き続き文字列を無効として拒否します。