Bu kod arkasında güvenlik konuları PHP pasajı

3 Cevap php

Ben gelişmiş PHP bazı kitapları okuyorsunuz, ve çoğu zaman bu gibi bir kod bulabilirsiniz:

$classes = array ("MyClass1", "MyClass2");

if (!in_array ($_GET['class'], $classes))
    throw new Exception ("Class not found!");

$params = $_GET;

$obj = new $_GET['class'];

if (!method_exists ($_GET['method'], $obj)
    throw new Exception ("Method not found!");

echo $obj->{$_GET['method']}();

Ben bu kodu bulmak kitap, yazar her zaman bu kod üretim ortamları için güvenli değildir, ve sınıf adı kontrol edilmelidir bahseder.

Sınıf adı bir dizide bu varlığını kontrol ediliyor eğer benim soru (ben kitap örneklerde değildi, bu eklenen), olduğunu, ne güvenlik konuları daha fazla almalı? Sınıf adı bot yüzden XSS filtreleme çok mantıklı değil çıktılanmasını edilecektir. Ayrıca sınıf adı veritabanı vurmak olmaz, bu nedenle SQL enjeksiyon filtreleme gerekli değil.

Tüm cevaplar için şimdiden teşekkür ederiz.

3 Cevap

Sen sınıfı söz güvenlik sorunu giderir değerleri sınırlı kümesi biri olup olmadığını görmek için kontrol ekledi. Bu (her Özellikle izin olanı hariç izinli varsayılan olarak) bir "beyaz liste" yaklaşımı olarak bilinen ve bu tür bir şey için doğru bir yaklaşım olur.

Yöntem GET parametresi aynı sorunu olabilir ama ben sömürdü olabilecek durumlar düşünemiyorum. Bütün bir sınıf sadece onlar sınıfları konum, özellikle eğer, yöntemleri sınırlı bir dizi var sonra. Sen sadece "z" ya da bir şey ile başlayan yöntemleri çağırabilir gibi hala, sadece güvenli olması için bir şekilde onları filtreleme değer olabilir.

Sınıf adı dizi aracılığıyla kontrol edilirken, yöntem adı değil. Sen, potansiyel olarak, böyle bir şey olabilir

class Foo
{
    function reset()
    {
        // rm -rf DocumentRoot
    }
}

Hangi ihtimal ise, potansiyel olarak var olabilir.

Put sadece kullanıcı girişi güven asla. Bu durumda, ben denebilecek geçerli işlevler bir listesini vermek istiyorum.

Ama sonra tekrar, ben bu gibi bir kod asla kullanmam, muhtemelen bazı URL yapardım <-> fonksiyon haritalama

Bu kod enjeksiyon patlatır açıktır.

Her zaman bu nedenle bir $ _GET dönen herhangi bir veri dezenfekte ve asla kullanıcı girişi çalıştırılabilir kod (ya da diğer bazı kötülüklerden) serbest olduğunu güvenmeliyiz.

Kod enjeksiyon ve sanitasyon girdiler hakkında çok daha fazlasını kapsar bu sitede http://stackoverflow.com/questions/38875/best-way-to-avoid-code-injection-in-php bakın.