PHP - Shorter Sihirli Tırnaklar Çözüm

4 Cevap php

Ben taşınabilir olması gereken bir uygulama yazıyorum. Ben bunu yapabilir miyim bilmiyorum PHP konfigürasyonuna, ancak bu durumda sihirli tırnak devre dışı gerektiğini biliyorum, bu yüzden aşağıdaki kodu kullanıyorum:

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);
}

Ben şu düşünce vardı sihirli tırnak devre dışı bırakma sürecini kolaylaştırmak için:

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

Ama ben denedim ve ben örneğin, ben anlamak mümkün değilim bir hata var ?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";}

But unserialize(stripslashes(serialize($_GET))) bana bu garip hata veriyor:

Notice: unserialize(): Error at offset 30 of 32 bytes


EDIT: Due to the length attribute in serialize() ben JSON fonksiyonlarını kullanmak için kodu değişti:

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

Ancak şimdi the $_GET dizisi boş geliyor, Herkes bana neden açıklayabilir?

4 Cevap

Bunu çözüldü, ben JSON_HEX_APOS bayrağı kullanmak zorunda json_encode():

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

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

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

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

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

Ben ikinci versiyonu çalışacağını sanmıyorum. Tefrika dizeleri karakterleri kaldırarak iseniz, bu uzunluk değeri güncelleştirmek gerekir, kendi uzunluğu ile birlikte saklanır. Ben oldukça okunabilirliği artırmak için bu şekilde uygulamak:

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);

Ben genellikle bu sorunu bu şekilde çözmek:

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)) );
    }
}

Ve sonra, $ _GET için:

$_GET = smagic($_GET);

0 aşağı oy

Ben daha kolay bir çözüm böylece gibi, komut 0'a zamanı sihirli tırnaklar için php.ini yönergesi atamak için olduğunu düşünüyorum:

ini_set('magic_quotes_runtime', '0');

Magic_quotes_gpc sadece / Post / Cookie işlemleri Get AXIL geçerlidir ayrı bir yönerge olduğunu. Ini_set () fonksiyonu geçici olarak (script ömrünü) php.ini ayarlarını değiştirmek için kullanılabilir. Bu, tüm sunucular arasında aynı davranışı almak sağlayacaktır. parametreler dizeleri şeklinde iki, ayarlamak istediğiniz yönergesi ve yeni değerin adıdır.