読む前提条件: PHP マニュアルの「パート IV セキュリティ」の「第 10 章 魔法の引用」を読んでいる必要があります。まだ見ていない場合でも問題ありません。今すぐ 10 分かけて PHP マニュアルのこの内容を読んでください。
マジック クォートは、PHP スクリプトに入力されるデータを自動的にエスケープするプロセスです。
プログラムを複数のデータベースと互換性を持たせたい場合がありますが、データベースでは異なるエスケープ文字が使用される場合があります。私たちのプログラムは異なる php.ini 設定を持つホスト上で実行される可能性があるため、magic quotes の設定は異なる可能性があるため、柔軟な PHP アプリケーションには互換性の高い PHP アプリケーションを作成することが必要です。
php.ini には 3 つの魔法引用符構成オプションがあります:
魔法引用符構成オプション |
説明 | 実行時の変更 | PHP のデフォルト値は |
magic_quotes_gpc | オンにすると、HTTP リクエスト データ (GET、POST、COOKIE) に影響します。 | できません | オン |
magic_quotes_runtime | オンにすると、ほとんどのデータが外部ソースから取得されますまた、データベースやテキスト ファイルなど、関数によって返されるデータはバックスラッシュでエスケープされます。 (前提条件は、magic_quotes_gpc = On) | Can | Off |
magic_quotes_sybase |
魔术引号配置选项 | 描述 | 运行时改变 | 在 PHP中的默认值为 | magic_quotes_gpc | 如果打开的话,影响到 HTTP 请求数据(GET,POST 和 COOKIE)。 | 不能 | On | magic_quotes_runtime | 如果打开的话,大部份从外部来源取得数据并返回的函数,包括从数据库和文本文件,所返回的数据都会被反斜线转义。(前提是magic_quotes_gpc = On) | 能 | Off | magic_quotes_sybase | 当关闭时,所有的 '(单引号),"(双引号),/(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义。这和 addslashes() 作用完全相同。 如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖 magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成 ''。而双引号、反斜线 和 NULL 字符将不会进行转义。 (前提是magic_quotes_gpc = On) | 能 | Off | いつオフにすると、すべての ' (一重引用符)、" (二重引用符)、/ (バックスラッシュ)、および NULL 文字はバックスラッシュで自動的にエスケープされます。これは、addslashes() と同じ効果があります。 オンにすると、一重引用符が使用されます。このオプションは、magic_quotes_gpc を完全にオーバーライドします。両方のオプションがオンの場合、一重引用符は '' としてエスケープされ、バックスラッシュと NULL 文字はエスケープされません。 (magic_quotes_gpc = On の場合) > | できます | オフ |
しかし、外部から送信されるグローバル変数を扱うのはさらに面倒です。
外部スーパー変数を処理するには、magic_quotes_gpc がオンになっているかどうか (magic_quotes_gpc がオンでなく、magic_quotes_sybase がオンになっている場合、magic_quotes_sybase は機能しません)、および magic_quotes_sybase がオンになっているかどうかを確認する必要があります。次に、プログラムがaddslashesまたはmagic_quotes_sybaseを使用して外部変数をエスケープする必要があるかどうかを判断します。以下のコードは具体的な実装です。
magic_quotes_gpc が On に設定され、magic_quotes_sybase が Off に設定されている場合、ini_set('magic_quotes_sybase', 1); を直接使用すると、システムが ' を使用して addslashes スタイルのエスケープをオーバーライドできると言う人もいるかもしれません。これではうまくいきません。 ini_get('magic_quotes_sybase') を使用して出力します。Magic_quotes_sybase は確かに変更されていますが、コードではエスケープ文字を使用してスラッシュ スタイルの自動エスケープをオーバーライドできません。これは、システムが外部変数を取得するときに、ini_set('magic_quotes_sybase', 1); より前に完了するためです。
/**
* magic_quotes の影響を受けない PHP アプリケーションを解決する
*
* この方法を使用するには、magic_quotes_sybase を使用して異なる DBMS に適応するかどうかを設定する必要があります
*
* 設定方法:
* $useQuotesSybase[データベース名] = 1;
* sqliteを使用する場合は、定義と初期化が可能 $useQuotesSybase['sqlite'] = 1;
* mysqlを使用する場合は、$useQuotesSybase['sqlite]の定義と初期化が可能' ] = 0;
*
* CONFIG_DB_DBMS は使用する DBMS の定数であり、別の場所で定義されます。たとえば、define('CONFIG_DB_DBMS', 'mysql');
*
* @author 流水梦春cmpan(at)qq.com
* @link http://lib.culog.cn
* $date 2007.11.18
*/
error_reporting(E_ALL);
set_magic_quotes_runtime(0);
define('CONFIG_DB_DBMS', 'sqlite'); // 使用
// ' を使用します。
$useQuotesSybase = array();
$useQuotesSybase['sqlite'] = 1;
$useQuotesSybase[' sybase'] = 1;
if(!empty($_POST)) $_POST = array_map('quotesOuterVars', $_POST);
if(!empty($_GET)) $_GET = array_map ('quotesOuterVars', $_GET);
$_COOKIE = array_map('quotesOuterVars', $_COOKIE);
$_REQUEST = array_map('quotesOuterVars', $_REQUEST);
function quotesOuterVars( $var) {
if (is_array($var)) {
return array_map('quotesOuterVars',$var);
} else {
if (get_magic_quotes_gpc()) {
if (isset($GLOBALS['useQuotesSybase'][CONFIG_DB_DBMS]) && $GLOBALS['useQuotesSybase'][CONFIG_DB_DBMS]) {
//当面必要です ' である转义符
//結果、magic_quotes_sybase = オフ、システム统将把外部变量addslashes, 我们得先stripslashes
//否则系统自动掌 ' 换成 '',
if (!ini_get('magic_quotes_sybase')) {
$var = ストリップスラッシュ($var );
$var = str_replace("'", """, $var);
}
} else {
/である转义符
/ / 如果 magic_quotes_sybase = オン、我们先掴 '' 替え换成 '、その後にまつげを追加します
// 否则系统自アニメーション引用
if (ini_get('magic_quotes_sybase')) {
$var = str_replace("' ", "''", $var);
$var =addlashes($var);
}
}
else{
if (isset($GLOBALS['useQuotesSybase' ][CONFIG_DB_DBMS]) && $GLOBALS['useQuotesSybase'][CONFIG_DB_DBMS]) {
$var = str_replace("'", "''", $var);
} else {
$var =addlashes($var);
}
}
return trim($var);
}
}
上の表から、magic_quotes_runtime については、プログラム内で ini_set('magic_quotes_runtime', 0); を使用することで無効にでき、独自のメソッドを使用してデータを処理できることがわかります。データベースまたはファイルのデータ。