$ _REQUEST Nasıl kötü olduğunu ve kabul edilebilir bazı Band-Aid karşı önlemler nelerdir?

4 Cevap php

Ben register_globals hatırlatıyor çünkü, kod koku gibi düşünüyorum superglobali $_REQUEST, kullanarak önerilen son zamanlarda popüler PHP ile ilgili cevaplar bir çift geldim.

Neden $_REQUEST kötü bir uygulamadır iyi bir açıklama / kanıt sağlayabilir? Ben kazılıp ettik örnek bir çift dışarı atarım, ve teorik bir saldırı vektörleri ve gerçek dünya patlatır yanı sıra, makul adımlar önerileri sysadmin kısa (riskini azaltmak için alabilir hem de daha fazla bilgi / perspektifi isterdim Uygulamayı yeniden ... ya biz need yönetimine gidin ve bir yeniden yazma ısrar mı?).

Example vulnerabilities: Standart GPC dizisi birleştirme sipariş COOKIE değerleri GET ve POST geçersiz olduğu anlamına gelir, böylece $_REQUEST XSS ve HTTP saldırılar için kullanılır. PHP çerez vars süper küresel dizileri üzerine yazmak sağlar. İlk 10 slaytlar this talk örnekleri (bütün konuşma büyük) vermek. CSRF saldırı phpMyAdmin exploit örnek.

Example countermeasures: yeniden yapılandırın $_REQUEST dizisi GPC CGP arası birleştirme-sipariş öylesine / POST etrafında değil başka bir yol, COOKIE üzerine yazma GET. Suhosin Süper küresellerin yazmayı engellemek için kullanın.

(Benim soru bir dupe olduğunu düşündüm eğer Ayrıca, soran olmaz, ama SO "When and why should $_REQUEST be used instead of $_GET / $_POST / $_COOKIE?" idi cevap mutlulukla ezici "Asla.")

4 Cevap

Kullanıcıdan veri almak için kullanılan bir yöntemdir: olduğu gibi sadece davranın. Bu dezenfekte ve onaylanmış olması, bu nedenle bir POST, GET veya çerez şeklinde geldiyse neden bakım gerekir? Bunlar hepsi çok söyleyerek, kullanıcı gelen 'onlar sahte olabilir!' gereksiz.

$ _REQUEST $ _GET, $ _POST Ve $ _COOKIE gibi bir kötülüktür. I geçerli senaryolar $ _REQUEST kullanmak için var ama $ _REQUEST kullanarak ve "kötü uygulamalar" olarak etiketlemek değil iyi bir neden olduğunu düşünüyorum iken.

$ _REQUEST Kullanarak temel nedeni parametresi $ _POST veya $ _GET transfer olsun olabilir. $ _REQUEST Erişerek bu değer ayarlanır hem $ _GET ve $ _POST kontrol etmek zorunda değilsiniz. Sorun ini ayarının gpc_order $ _REQUEST inşa nasıl davranışını değiştirebilir olmasıdır. Bu ayar, bir sunucudan diğerine farklılık gösterebilir ve size komut dosyası davranışı değişebilir.

$_REQUEST bu URL ($_GET) ve istek gövdesi arasındaki farkı görmezden çünkü sorunlu ($_POST). HTTP-POST yan etkileri olabilir ve böylece önbelleğe olamaz iken bir HTTP-GET isteği, yan etkileri olmadan olmalıdır. Bir kova içine bu oldukça farklı veri kaynaklarını Fırlatma, kötü uygulamaları demek olan un-REST-ful uygulamalar için çağırır.

Onun URL geçti şey savunmasız. Bir form teoride kullanıcı düzenleyemezsiniz rağmen, formu ile teslim edildi "kullanıcı kimliği" ile gizli bir alanı içeren Böylece, eğer yeterince istekli eğer onlara değerini değiştirmek durdurma şey yok.

Sadece istek dışı değerini almak istiyorsanız, bu iyi, ama bunu çok iyi sahte olabilir farkında olması gerekir, bu nedenle buna göre hareket, ve kesinlikle güvenli param / değer verisi için kullanmak değil gerekir.