PHPの歴史では、Magic QuotesはかつてSQLインジェクションなどのセキュリティ問題を防ぐために、GET、投稿、およびCookieからのデータの処理を自動的に追加するデフォルト機能でした。ただし、便利さをめぐる混乱は利便性よりも多いため、魔法の引用はPHP 5.4.0から完全に削除されました。
それにもかかわらず、いくつかの古いシステムを維持する場合、PHP 5.3以下にまだ遭遇する可能性があります。魔法の引用がオンになっているかどうかを判断することが非常に重要です。この記事では、get_magic_quotes_gpc()関数を使用して判断を下し、対応するベストプラクティスの提案を提供する方法を紹介します。
get_magic_quotes_gpc()は、 magic_quotes_gpcが有効になっているかどうかを判断するために、phpによって提供される組み込み関数です。その返品値はブール値です:
魔法の引用が有効になっていることを示すためにtrueを返します。
falseを返すということは、魔法の引用が無効になっていることを意味します。
if (get_magic_quotes_gpc()) {
echo "魔法の引用がオンになっています";
} else {
echo "魔法の引用は閉じられました";
}
「未定義の関数」などの関数を実行するときにエラーメッセージを受信した場合、PHPバージョンが5.4よりも高く、魔法の引用が削除されていることを意味します。
魔法の引用の当初の意図は良いですが、実際にはデータの繰り返しの脱出を引き起こします。開発者は、動作環境に基づいてストリップスラッシュ()を手動で処理するかどうかを動的に判断する必要があります。例えば:
$user_input = $_POST['username'];
if (get_magic_quotes_gpc()) {
$user_input = stripslashes($user_input);
}
このコードにより、 $ user_inputのデータが魔法の引用のために冗長に逃げられないことを保証します。これにより、その後の統一処理が容易になります。
最も推奨される方法は、毎回判断するのではなく、入り口ですべてのGPCデータを均一に処理することです。
function strip_magic_quotes(&$array) {
foreach ($array as $key => $value) {
if (is_array($value)) {
strip_magic_quotes($array[$key]);
} else {
$array[$key] = stripslashes($value);
}
}
}
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
strip_magic_quotes($_GET);
strip_magic_quotes($_POST);
strip_magic_quotes($_COOKIE);
}
この方法により、アプリケーション内のすべてのユーザー入力データが最初から「精製」され、その後の論理処理が簡素化されます。
互換性は上記の方法を使用して処理できますが、最良の解決策はPHPバージョンをアップグレードすることです。モダンなPHPフレームワーク(Laravel、Symfonyなど)は、もはや魔法の引用をサポートしたり、頼ったりしません。以下など、データフィルタリングとセキュリティ制御のためのより完全な方法があります。
filter_input()およびその他の入力フィルター関数を使用します。
PDO結合パラメーターを使用して、SQL注入を防ぎます。
HTML出力にはhtmlspecialchars()を使用します。
古いPHPシステムをデバッグするときは、単純なデバッグスクリプトを使用して、現在の環境が魔法の引用でオンになっているかどうかをすばやく判断できます。
echo '<pre>';
echo 'magic_quotes_gpc: ' . (get_magic_quotes_gpc() ? 'ON' : 'OFF') . PHP_EOL;
echo 'Sample $_GET: ' . print_r($_GET, true);
echo '</pre>';
スクリプトを展開した後、次のようなURLにアクセスします。
http://gitbox.net/debug.php?name=O\'Reilly
出力が次のとおりです。
name => O\\'Reilly
つまり、魔法の引用が有効になっていることを意味し(バックスラッシュが自動的に追加されます)、ストリップスラッシュ()が必要です。