以前のPHPバージョンでは、 get_magic_quotes_gpc()関数を使用して、 magic_quotes_gpc構成アイテムが有効になっているかどうかを判断しました。このアイテムがオンになると、PHPはGet 、 Post 、 Cookieを通じて送信されたデータを自動的にエスケープします。つまり、特殊文字の前にバックスラッシュを自動的に追加します(単一引用符、二重引用符など」 、バックスラッシュ\など)。
MAGIC_QUOTES_GPCが有効になっている場合、ユーザーが送信したデータは、エスケープ文字で自動的に追加されています。開発者がAddSlashes()およびその他の関数を手動で使用してデータを受信した後にこれらの入力を処理すると、二重脱出の問題が発生します。たとえば、元々入力された文字列は次のとおりです。
I'm a user.
MAGIC_QUOTES_GPCによって初めて自動的に脱出されるのは、次のようになります。
I\'m a user.
この時点でaddslashes()を再度使用する場合:
I\\'m a user.
その後、データベースに保存されているコンテンツは、ユーザーの当初の意図と矛盾し、データの混乱を簡単に引き起こす可能性があります。
ダブルエスケープを避けるために、開発者はまずMAGIC_QUOTES_GPCが有効かどうかを判断する必要があります。有効にした場合は、最初にデータの反転を実行し、必要に応じて手動エスケープを実行するかどうかを決定します。
ユーザーによる配列入力を再帰的に処理して、すべてのデータのバックスラッシュが正しく削除されるようにすることができます。
これがサンプルコードです:
<code> function cleaninput($ data){if(is_array($ data)){return array_map( 'cleaninput'、$ data); } else {return stripslashes($ data); }} if(get_magic_quotes_gpc()){
$ _get = cleaninput($ _ get);
$ _POST = CleanInput($ _ POST);
$ _COOKIE = CleanInput($ _ Cookie);
}
</code>
この例では、配列内の各値を再帰的に処理するCleanInput()関数を定義し、 Stripslashes()を呼び出して不必要なエスケープ文字を削除します。 get_magic_quotes_gpc()がtrueを返す場合、3つのハイパーグローバルアレイ、 $ _get 、 $ _post 、および$ _cookieがクリーニングされます。
MAGIC_QUOTES_GPCはPHP 5.4.0で非推奨されており、PHP 7.0.0で完全に削除されていることに注意してください。したがって、現代のPHP開発では、この問題はもはや存在しません。しかし、古いプロジェクトを維持したり、いくつかのレガシーシステムを処理したりする場合、それらに対処する方法を知る必要があります。
古いバージョンのPHPを使用していてアップグレードできない場合は、プロジェクトが初期化されたときに統合処理ロジックを実行することをお勧めします。後続の操作を実行する前にすべての入力をクリーニングします。
さらに、最新のデータベースアクセスメソッド(PDOなど)とパラメーター結合メカニズムを組み合わせて、SQL注入を防ぐだけでなく、手動で逃げる弦の累積性も回避できます。例えば:
<Code> $ PDO = new PDO( 'mysql:host = localhost; dbname = test'、 'user'、 'password'); $ stmt = $ pdo-> prepare( 'select * from users where where email =:email'); $ stmt-> execute(['email' => '[email protected]']); </code>上記のように、パラメーター結合はSQLの直接的なスプライシングを回避し、脱出と注入の問題を根本的に解決します。
MAGIC_QUOTES_GPCの自動エスケープメカニズムは、「一見安全な」設計ですが、実際の開発により多くの問題をもたらすことがよくあります。その動作の原則を理解し、適切な処理方法を採用すると、データの二重脱出の問題を効果的に回避できます。同時に、最新のPHPプログラミングパラダイムとデータベースインターフェイスを使用して、これらの時代遅れの機能の依存関係を徐々に排除して、コードの保守性とセキュリティを改善することもお勧めします。