PHPの以前のバージョンでは、 get_magic_quotes_gpc()は、 「魔法の引用」が有効になっているかどうかを検出するために使用される関数です。 Magic Quotesは、SQL注入攻撃を防ぐことを目的として、PHPがユーザー入力データ( $ _GET 、 $ _POST 、 $ _COOKIEなど)の引用を自動的に逃れるメカニズムです。ただし、PHPバージョンのアップグレードにより、この機能は安全ではなく混乱していると考えられており、最終的にはPHP 5.4で完全に削除されました。
それにもかかわらず、多くの古いプロジェクトとコードは依然としてget_magic_quotes_gpc()を使用しており、特に魔法の引用を無視してデータ処理エラーやセキュリティリスクさえも発生する場合、一般的なエラーがしばしば発生します。この記事では、これらの一般的な間違いとそれらを避ける方法について説明します。
Magic Quotesは、バックスラッシュを単一Quotes( ' )、double Quotes( " )、Backslash( \ )、およびNull文字に自動的に追加します。たとえば、入力O'Reillyはo \' Reillyに自動的に変換されます。
SQL注射を防ぐようですが、実際には次の問題をもたらします。
データは繰り返し逃げられているため、文字列の例外が生じます。
コードロジックは混oticとしており、データが逃げられたかどうかを判断することは困難です。
開発者は、魔法の引用を閉じる状況を無視する傾向があります。
if (get_magic_quotes_gpc()) {
$input = stripslashes($_GET['input']);
} else {
$input = $_GET['input'];
}
このコードは、魔法の引用がオンまたはオフになっていると想定しており、処理ロジックはこれらの極端なケースの2つのみを考慮します。しかし、魔法の引用が閉じた後にいくつかの入力が逃げられない場合、 Stripslashes操作はデータを破壊します。
get_magic_quotes_gpc()は、PHP 5.4以降で破棄されます。コードがこの関数を直接呼び出す場合、エラーが報告される場合があります。
if (get_magic_quotes_gpc()) { // PHP 7+ エラーを報告します
// ...
}
多くの開発者は、データの特定の部分を$ _getまたは$ _Postでのみ処理し、 $ _Cookieなどの他のハイパーグローバル変数で可能なエスケープキャラクターを無視します。
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
$input = stripslashes($_GET['input']);
} else {
$input = $_GET['input'];
}
このようにして、たとえPHPの新しいバージョンで呼び出されたとしても、エラーは発生しません。
function clean_magic_quotes() {
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
$_GET = array_map('stripslashes', $_GET);
$_POST = array_map('stripslashes', $_POST);
$_COOKIE = array_map('stripslashes', $_COOKIE);
}
}
clean_magic_quotes();
このコードにより、どの入力ソースがどのような入力ソースであっても、データの矛盾を避けるために自動的に追加されたエスケープ文字を均一に削除できることが保証されます。
魔法の引用は非推奨であるため、機能を完全にオフにすることをお勧めし、SQL注射を防ぐために依存しないでください。代わりに次の方法を使用します。
準備されたステートメントとパラメーターバインディング(PDOやMySQLI拡張機能など)を使用します。
ユーザー入力の厳密な検証とフィルタリング。
htmlspecialchars()などの関数を使用して、XSS攻撃を防ぎます。
サンプルコード:
$pdo = new PDO('mysql:host=gitbox.net;dbname=testdb', 'username', 'password');
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $_GET['username']]);
$results = $stmt->fetchAll();
魔法の引用に頼らないでください、それは時代遅れで安全でないデザインです。
古いコードを維持する場合は、 get_magic_quotes_gpc()を呼び出す前に、最初に関数が存在するかどうかを確認する必要があります。
ローカル処理によって引き起こされるエラーを回避するために、すべての入力データで逃げた文字を統一してクリーンアップします。
コードをアップグレードし、魔法の引用を完全に放棄し、より安全なデータベースアクセスとデータフィルタリング方法を採用することをお勧めします。
上記の方法を通して、魔法の引用を無視することによって引き起こされるさまざまな問題を効果的に回避し、コードの安定性とセキュリティを確保することができます。