mysql_real_escape_string の使用における脆弱性
SQL インジェクション攻撃から保護するために mysql_real_escape_string を使用することの潜在的なリスクについて多くの人が懸念を表明していますが、懸念を表明している人はほとんどいません。その限界を説明する具体的な例を示しました。これに対処するために、この関数の主な欠点を詳しく調べてみましょう。
間違った使用法
mysql_real_escape_string を使用する際のよくある落とし穴の 1 つは、数値の誤った処理です。次のコードを考えてみましょう:
mysql_query('DELETE FROM users WHERE user_id = '.mysql_real_escape_string($input));
ここで、mysql_real_escape_string は数値ではなく文字列のサニタイズ用に設計されているため、入力 '5 OR 1=1' は保護を回避します。
コンテキスト-固有の制限
mysql_real_escape_string のもう 1 つの制限は、その特定の使用コンテキストにあります。これは、SQL ステートメント内の引用符で囲まれた文字列内の値をエスケープすることを目的としており、引用符で囲まれていない値や SQL 構文内での直接のような他のコンテキストではエスケープすることを目的としていません。
たとえば、次のコードは脆弱です。
mysql_query("... `foo` = $value ...");
上で説明したように、このシナリオでは mysql_real_escape_string は適切に呼び出されません。
エンコーディングの問題
さらに、データベース接続エンコーディングの設定が間違っていると、脆弱性が発生する可能性があります。接続エンコーディングが mysql_set_charset('utf8') ではなく mysql_query("SET NAMES 'utf8'") を使用して設定されている場合、mysql_real_escape_string は間違った文字エンコーディングを想定し、文字列を不適切にエスケープします。これにより、マルチバイト文字列を含むインジェクション攻撃が促進される可能性があります。
結論
mysql_real_escape_string は、正しく使用されれば固有の脆弱性はありませんが、主な懸念は、誤った使用に対する脆弱性にあります。上で説明した制限は、この機能を効果的に適用する際の課題を示しており、SQL インジェクション攻撃に対する堅牢な保護を確保するには、プリペアド ステートメントやパラメーター化されたクエリなどの代替アプローチを検討することが重要です。
以上が「mysql_real_escape_string」は本当に安全ですか?関数の制限を調べます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。