9

私は、いくつかの異なるセットアップで実行される一連の PHP スクリプトを作成しています。そのうちのいくつかは、魔法の引用符でホストを共有しています (ホラー)。PHP または Apache の構成を制御する機能がない場合、実行時に PHP の引用符を無効にするためにスクリプトで何かを行うことはできますか?

コードがマジック クォートがオンであると想定しない方がよいでしょう。そうすれば、マジック クォートがある場合とない場合がある別のホストで同じスクリプトを使用できます。

4

5 に答える 5

15

実行時に無効にできるのは、magic_quoted_runtimeのみです。ただし、実行時にmagic_quotes_gpcを無効にすることはできません ( PHP_INI_ALLは PHP 4.2.3 までは変更可能で、それ以降は PHP_INI_PERDIRなります)。それらのみを削除できます:

if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}

詳細については、マジック クォートの無効化を参照してください。

于 2009-07-20T14:00:36.673 に答える
5

実行時にマジック クォートを無効にすることはできませんが、ディレクトリ内の .htaccess ファイルを使用して無効にすることができます。

php_flag magic_quotes_gpc off

これが持つ唯一の本当の利点は、ディレクトリに一度置くだけで、ディレクトリ全体とサブディレクトリに対して機能することです。あなたが書いていないアプリケーションにこれが必要で、魔法の引用符なしで動作させる必要がある場合は、本当に素晴らしいです。

于 2009-07-20T14:01:24.097 に答える
2

ガンボに似た小さなスクリプトがあります (もちろん、私のほうが好きです :):

if(function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime())
    set_magic_quotes_runtime(false);

if(get_magic_quotes_gpc()) {
    array_stripslashes($_POST);
    array_stripslashes($_GET);
    array_stripslashes($_COOKIES);
}

function array_stripslashes(&$array) {
    if(is_array($array))
        while(list($key) = each($array))
            if(is_array($array[$key]))
                array_stripslashes($array[$key]);
            else
                $array[$key] = stripslashes($array[$key]);
}
于 2009-07-20T14:04:53.487 に答える
1

PHP 5.3 以降の別のソリューション:

if (get_magic_quotes_gpc() === 1)
{
    $_GET = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_POST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_COOKIE = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_REQUEST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
}

キー、値、および多次元配列を処理します。

于 2010-01-17T02:55:00.703 に答える
0

実行時に行うことはできません:(

于 2009-07-20T14:01:13.660 に答える