mysql_real_escape_string の欠点: 間違った使用法と範囲の制限
mysql_real_escape_string 関数は、SQL インジェクション攻撃に対する保護が不完全であるとして批判されています。 SQL ステートメントの引用符内で使用することを目的とした文字列を効果的にエスケープしますが、正しく適用することが重要です。
重要な欠点の 1 つは、数値の誤った処理です。 mysql_real_escape_string が数値に適用される場合、数値の性質が保持され、インジェクション攻撃に対して脆弱なままになります。例:
mysql_query('DELETE FROM users WHERE user_id = '.mysql_real_escape_string($input));
入力「5 OR 1=1」の場合、mysql_real_escape_string が入力を文字列に変換しないため、インジェクション攻撃は成功します。
もう 1 つの欠点は、スコープが制限されていることです。 mysql_real_escape_string の。これは、SQL ステートメントの引用符内の文字列をエスケープすることのみを目的としています。変数の割り当てや連結など、他のコンテキストに適用すると、誤って脆弱性が発生する可能性があります。
データベース接続のエンコーディングが正しくない場合もリスクが生じます。 mysql_query("SET NAMES 'utf8'") コマンドを使用してエンコーディングを設定すると、mysql_ API がバイパスされ、クライアントとデータベースの間で文字列解釈の不一致が発生する可能性があります。これにより、マルチバイト文字列を含む SQL インジェクション攻撃が容易になる可能性があります。
mysql_real_escape_string が正しく使用されている場合、基本的なインジェクションの脆弱性がないことに注意することが重要です。ただし、その範囲が狭く、誤った適用が行われやすいため、最新のソフトウェア開発にとっては信頼性の低いオプションとなっています。プリペアド ステートメントまたはパラメーター バインディング メカニズムを安全な言語インターフェイスと組み合わせて使用すると、SQL インジェクション攻撃に対するより堅牢な保護が提供されます。
以上がSQL インジェクションを防ぐには mysql_real_escape_string が不十分なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。