0

ポータブルである必要があるアプリを書いています。PHP構成でマジッククォートを無効にする必要があることはわかっていますが、この場合、それができるかどうかわからないため、次のコードを使用しています。

if (get_magic_quotes_gpc() === 1)
{
    $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);
}

魔法の引用を無効にするプロセスを簡素化するために、私は次のアイデアを思いつきました。

if (get_magic_quotes_gpc() === 1)
{
    foreach (array('GET', 'POST', 'COOKIE', 'REQUEST') as $array)
    {
        ${'_'.$array} = unserialize(stripslashes(serialize(${'_'.$array})));
    }
}

しかし、試してみたところ、理解できないエラーが発生しました。たとえば、?name=O'Reilly次のようになります。

serialize($_GET); // a:1:{s:4:"name";s:9:"O\'Reilly";}
stripslashes(serialize($_GET)); // a:1:{s:4:"name";s:9:"O'Reilly";}

しかしunserialize(stripslashes(serialize($_GET)))、私にこの奇妙なエラーを与えます:

注意:unserialize():32バイトのオフセット30でエラーが発生しました


編集:の長さ属性のため、serialize()JSON関数を使用するようにコードを変更しました:

if (get_magic_quotes_gpc() === 1)
{
    foreach (array('GET', 'POST', 'COOKIE', 'REQUEST') as $array)
    {
        ${'_' . $array} = json_decode(stripslashes(json_encode(${'_' . $array})), true);
    }
}

しかし$_GETアレイが空になりつつあるのですが、その理由を誰かに説明してもらえますか?

4

3 に答える 3

2

2番目のバージョンは機能しないと思います。シリアル化された文字列は長さとともに保存されます。文字を削除する場合は、その長さの値を更新する必要があります。読みやすさを向上させるために、この方法で実装したいと思います。

function strip_slashes_recursive(&$value) {
    if (!is_array($value)) {
        $value = strip_slashes($value);
    } else {
        foreach (array_keys($value) as $key) {
            $arrayValue = strip_slashes_recursive($value[$key]);
            unset($value[$key]);
            $value[strip_slashes($key)] = $arrayValue;
        }
    }
}

foreach (array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST) as &$array) {
    strip_slashes_recursive($array);
}
// don't forget to unset references or it can lead to very nasty bugs
unset($array);
于 2010-01-16T15:16:19.437 に答える
1

それを解決しました、私はJSON_HEX_APOSフラグを使用しなければなりませんでしたjson_encode()

if (get_magic_quotes_gpc() === 1)
{
    $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true);
}

前(mqgpc.php?name[got'cha]=O'Reilly):

Array
(
    [name] => Array
        (
            [got\'cha] => O\'Reilly
        )
)

後(mqgpc.php?name[got'cha]=O'Reilly):

Array
(
    [name] => Array
        (
            [got'cha] => O'Reilly
        )
)
于 2010-01-16T16:17:46.053 に答える
0

私は通常、この問題を次のように解決します。

function smagic($params){
    if(get_magic_quotes_gpc()){
        if(!is_array($params))
            return stripslashes($params);
        else
            return array_combine( array_map('stripslashes',array_keys($params)), array_map('smagic',array_values($params)) );
    }
}

そして、$ _ GETの場合:

$_GET = smagic($_GET);
于 2010-01-16T16:00:23.580 に答える