$ Yerine PHP $ _GET ['var'] içinde var?

10 Cevap

Tamam ben bu konuda ama kullanabileceğiniz bazı sunucularda ayrıntıları hatırlayamıyorum

$_GET['var'] URL bir değişken erişmek için $var yerine, ben bu kötü olduğunu biliyorum ama neden kötü ben hatırlayamıyorum?

10 Cevap

Sana Register Globals demek düşünüyorum.

Onlar EGPCS değişkenleri (Environment, GET, POST, Çerez, Sunucu) herhangi bir kaynaktan gelebilir beri bu değişken değerlerin kaynağını ayırt edemez çünkü bunları kullanmak gerekir.

Yani bir değer $_ENV['var'], $_GET['var'], $_POST['var'] den ise ya $var, sen diyemezsin, {[(varsa 4)]} veya $_SERVER['var'].

Özelliği Register Globals denilen ve insanların koduna değişkenleri enjekte için izin verir. the documentation örnekler için bakınız; Burada biri:

<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>

Eğer sunucu varsa register_globals php.ini dosyasında 1 (veya true) ayarlanmış olduğunu kullanabilirsiniz.

Bir noktada, bu varsayılan olarak devre dışı olmaya başladı, ve uygulamalar bu kötü bir uygulama olmasının bir nedeni olduğu, kırmaya başladı.

Sen php.ini değişkenler here bir listesini görebilirsiniz.

PHP kapsam olacak sizin değişkenleri yolu ile kendinizi karıştırmayın, çünkü o da kötü. Eğer dikkatli değilseniz veri yazılmadan kadar rüzgar olabilir. Ayrıca, $ _GET kullanarak gerçekleştirmek için çalıştığınız ne kadar nettir.

Insanlar keyfi değişkenlere değerleri enjekte icar çok kötü bir şey çünkü. Orada bir şey saklamak olabilir ve onlar da sizin güvenliğini tehlikeye bazı değer üzerine yazabilirsiniz. isset bir değer kullanmaya çalışmadan önce ayarlanmış olduğunu kontrol etmek için kullanmayı unutmayın.

Eğer bunu (PHP yapmaya zorlar olmayacak bir şey) kullanmak için önce her değişken başlatmak için dikkatli değilseniz, insanların kolayca kodu ({[gibi basit bir istek ile Very Bad Things yapmak neden olabilir çünkü kötü 0)]}.

Ayar REGISTER_GLOBALS denir ve burada tartışıldı:

Why is REGISTER_GLOBALS so bad?

Bunu yapabilirsek, o zaman "register_globals" açıktır. Bir değişken nereden geldiğini bilmiyor olacak ve herhangi bir kullanıcı URL yoluyla enjekte edebilir olanlar ile değişkenleri karışır çünkü bu çok kötü. Devamı burada: http://www.php.net/manual/en/security.globals.php

Vb $ _POST, $ _GET, kullanmaya alışmak kez kodun amacı okumak ve çok, çok daha kolay korumak için daha kolay olacaktır.

Üye Ol globallerinin çalışacak ama PHP bir gelecek sürümünde going to go away bulunuyor. O gerçekten etkin olması yanlış olduğunu cabası.

Sen daha kontrollü bir davranış için extract() kullanabilirsiniz. Bu değişkenler gibi yerel bağlam içine (bu durumda, $ _GET) Bir dizinin anahtarları çıkartacaktır. Onlar mevcut değişkenleri ile çarpışır kalmamak onlara ortak bir önek verebilir. Ve emin sadece beklenen değişkenleri alıyoruz yapmak için önceden bir dizi filtre edebilirsiniz.

int extract( $var_array [, $type = EXTR_OVERWRITE [, $prefix  ]] )

Simge tablosuna dahil bir dizi değişkenleri aktarın.