2008-11-03 16 views
9

Geçtiğimiz birkaç popüler PHP ile ilgili cevaplar ile karşılaştım. Bu, kod kokusu olduğunu düşündüğüm süper küresel $_REQUEST'u önerdi, çünkü bana register_globals'u hatırlattı.

$_REQUEST niçin kötü bir uygulama olduğu hakkında iyi bir açıklama/kanıt sunabilir misiniz? Ben kazdık birkaç örnek dışarı atmak, ve hem teorik saldırı vektörleri ve gerçek dünya patlamalar hakkında daha fazla bilgi/perspektif, yanı sıra sysadmin riskini azaltmak için alabileceği makul adımları önerileri isterim. Uygulamayı yeniden yazıyor ... veya yönetimine gitmek için'a ihtiyacımız var mı ve yeniden yazma konusunda ısrar mı edelim?).

Örnek güvenlik: Standart GPC dizi birleştirme dereceden COOKIE değerleri almak ve POST geçersiz olduğu anlamına gelir, yani $_REQUEST XSS ve HTTP saldırı için de kullanılabilir. PHP, çerez çeşitlerinin süper küresel dizilerin üzerine yazılmasına izin verir. this talk'un ilk 10 kaydı örnek verir (bütün konuşma mükemmeldir). CSRF saldırısının phpMyAdmin exploit örneği.

Örnek önlemler: ayarlarını yeniden $_REQUEST dizi birleştirme dereceden GPC den CGP kadar/POST COOKIE, değil, başka bir yol üzerine GET. Superglobals'ın üzerine yazmak için Suhosin kullanın.

(oldu benim soru dupe olduğunu düşünmüş Ayrıca, soran olmaz, ama mutlu ezici SO "When and why should $_REQUEST be used instead of $_GET/$_POST/$_COOKIE?" cevap "Asla.") URL üzerinde geçirilen şey

cevap

0

Onun savunmasız. Böylece eğer bir form, formla birlikte sunulan "userid" ile bir gizli alan içeriyorsa da, teoride kullanıcı onu düzenleyemese de, yeterince durma durumunda değeri değiştiren hiçbir şey yoktur.

Sadece istekte bulunan değeri almak istiyorsanız, bu iyi, ancak çok iyi bir şekilde sahte olabileceğinin farkında olmanız gerekiyor, bu nedenle buna göre hareket etmelisiniz ve kesinlikle güvenli param/değer için kullanmamanız gerekiyor veri.

+0

Ayrıca form defterini veya çerezleri de taklit edebilirsiniz. COOKIE POST hakkında özel bir şey yoktur, bu da aldatmayı daha da zorlaştırır. – Kibbee

+1

Yine de bir şey var. GET değişkenleri bir CSRF saldırısının parçası olarak kullanılabilir. Sadece bazı şeyler için POST veya COOKIE'ye izin vermek, bu tür saldırıları daha da zorlaştırır. – troelskn

6

Sadece olduğu gibi davranın: kullanıcıdan veri almak için bir yöntem. Sterilize edilmeli ve onaylanmalıdır, o zaman neden bir POST, bir GET veya bir çerez şeklinde geldiği umurunda olsun? Hepsi kullanıcılardan geliyor, bu yüzden 'onlar sahte olabilir!' gereksizdir.

5

$ _REQUEST, $ _GET, $ _POST ve $ _COOKIE gibi bir kötülüktür. Ben _REQUEST kullanmak için geçerli senaryolar olduğunu düşünüyorum ama $ _REQUEST kullanmanın ve "kötü uygulama" olarak etiketlemenin iyi bir nedeni var.

$ _REQUEST kullanarak ana nedeni, parametrenin $ _POST veya $ _GET içinde aktarılabilmesidir. $ _REQUEST kaynağına erişerek, hem $ _GET hem de $ _POST değerini kontrol etmeniz gerekmez. Sorun şu ki, ini ayarı gpc_order, davranışı $ _REQUEST in nasıl oluşturduğunu değiştirebilir. Bu ayar sunucudan sunucuya farklılık gösterebilir ve siz komut dosyası davranışı değiştirebilir. URL'ye ($_GET) ve istek gövdesinin ($_POST) arasındaki farkı görmezden çünkü

5

$_REQUEST problemlidir. Bir HTTP-GET isteği yan etkilere sahip olmamalı, bir HTTP-POST ise yan etkilere sahip olabilir ve bu nedenle önbelleğe alınamaz. Bu oldukça farklı veri kaynaklarını tek bir kovaya atmak, kötü uygulamalar anlamına gelen un-REST -ful olan uygulamaları çağırır.

+1

not: hem GET hem de POST istekleri '$ _GET' ve' $ _POST' verileri alabilir. HTTP metodu ile spesifik süper küreseller arasında bir ilişki yoktur. – Javier

İlgili konular