Magic_quotes_gpc için panzehir (?)

5 Cevap php

Ben böyle gitmek PHP parçacıkları onlarca gördüm:

function DB_Quote($string)
{
    if (get_magic_quotes_gpc() == true)
    {
        $string = stripslashes($string);
    }

    return mysql_real_escape_string($string);
}

I DB_Quote("the (\\) character is cool"); ararsanız ne olur? (Thanks jspcal!)

Biz bölü şerit gerekiyordu değil sadece get_magic_quotes_gpc() == true and değeri $_GET, $_POST veya {[(4)] kökenli } superglobals?

5 Cevap

Evet, ben de böyle PHP parçacıkları onlarca gördüm. Bu biraz üzücü.

Sihirli tırnak bir giriş sorunu vardır. Bu magic_quotes_gpc olduğu faul arkaik wrongness kullanarak sunucuları üzerinde çalıştırmak için bir uygulamaya ihtiyacınız varsa, GET / POST / COOKIE dizileri yineleme ve eğik kaldırarak, giriş aşamasında sabitlenmelidir. Basit bir alternatif ayarladığınızda sihirli tırnak seçeneği algılar ve bir "sunucu berbat" hatası ile ölmek.

mysql_real_escape_string bir çıkış konudur. Bu size (kesinlikle düşünmelisiniz) Parametrelenmiş sorguları kullanarak değilseniz içeriği, veritabanı başlığı, senaryonun çıkış yolu üzerinde çalıştırılması gerekir.

Bu programda iki ayrı ilgisiz aşamaları vardır. Bunu tek bir kutu içine tüm dize işleme saklanması için denemek için olabilir ama cazip, aynı işlevi onları koyamazsınız.

Biz bölü sadece şerit gerekiyordu değil [...] değeri $ _GET, $ _POST veya $ _COOKIE superglobals kökenli?

Evet, kesinlikle. Hangi alıntı pasajı gerçekten zararlı olmasının nedeni budur. Bir dize kökeni izleme pratik olduğu için (farklı kaynaklardan dizeleri birleştirmek olabilir, özellikle de biri indirdi ve diğer değil), bir işlevde bunu yapamaz. Bu uygun zamanda denilen iki ayrı string işleme fonksiyonları olmalıdır.

Adım bir tamamen sihirli tırnak kapatmak ve üzerinde ise büyük unignorable uyarıları hazırlamaktır.

Bu sizin için bir seçenek değilse, o zaman bence, gitmek için en iyi yolu, tüm sihirli tırnak her zaman kaldırmaktır.

// in an include used on every page load:
if (get_magic_quotes_gpc()) {
    foreach (array('_GET', '_POST', '_COOKIE', '_REQUEST') as $src) {
        foreach ($$src as $key => $val) {
            $$src[$key] = stripslashes($val);
        }
    }
}

Küçük bir performans vurdu, ancak daha sonra gelen değişkenler ile çalışırken içinizin bir LOT daha kolay verecektir.

evet dav komut kadar sadece form girişi stripslashes kullanmak için, dediğim gibi ...

Eğer string "O'Reilly" ile stripslashes ararsanız, dize değişmiş olmayacak. sizin gibi bir dize ile stripslashes ararsanız: "ters eğik çizgi (\) karakteri cool", sonuç) ile kaçış dizisi \) yerini alacak. böylece, tüm db değerler üzerinde bu işlevi kullanarak kurnazca şeyleri kırabilir, ama bunu fark olmayabilir.

Birçok uygulamalar gibi, siz de sadece sihirli tırnak modunu desteklemiyor olabilir. Bunun için kontrol edin ve üzerinde ise bir hata yazdırın. bu yıl için varsayılan olarak kapalı oldu ve bu tavsiye edilmez.

Sen $ _GET, $ _POST ya da onlarla başka bir şey yapmadan önce $ _COOKIE üzerinde aşağıdakileri yaparak deneyebilirsiniz:

<?php
if (get_magic_quotes_gpc ())
{
    $_POST = array_map ('stripslashes', $_POST);
}
?>

Lütfen giriş dizisi (alt-diziler içermiyor) "düz" ise, bu sadece çalışacak, unutmayın. Eğer giriş alt diziler bekliyoruz o zaman bunu işlemek için kendi geri arama yazmak gerekir. Gibi bir şey

<?php
function slashField ($input)
{
    if (is_array ($input))
    {
        foreach ($input as $key => $row)
        {
            $input [$key]   = slashField ($row);
        }
    }
    else
    {
        $input  = stripslashes ($input);
    }
    return ($input);
}

if (get_magic_quotes_gpc ())
{
    $_POST = array_map ('slashfield', $_POST);
}
?>

Sayı 6 doğru bir fikir ama işe yaramazsa, PHP 5.4 $ $ src [$ anahtar] $ src [0], _ bir değişken $ oluşturma $ src olarak yorumlanır [$ anahtar] değişken değişken sözdizimi kullanır çünkü kadar hangi işe yaramaz. Sadece kullanın ve $ Val (referans operatör) ve $ val = stripslashes ($ val). PHP sadece _ için 0 döküm değil, çünkü ek olarak, aksi üzerinde PHP 5.4 den, muhtemelen bir hata alıyorum