$ _REQUEST Güvenlik sorunu var mı?

7 Cevap php

My henchman is learning PHP currently,
and he sent me his PHP code,
and I found that he uses $_REQUEST in his code.

The textbook I read says that
$_REQUEST has security problem so
we better use $_POST.

so I replied to the henchman that
we better to use $_POST.

Tamam mı?

7 Cevap

Ben $ _REQUEST daha güvenli olarak $ _POST karakterize etmek tehlikeli olduğunu söyleyebilirim.

Veri geçerliliği ve kullanılmadan önce dezenfekte ediliyor değilse, saldırı olası bir vektör var.

In short: It doesn't matter where the data comes from if it is not being handled in a secure manner.

De, $_REQUEST sorunları vardır sebebi, yani $_COOKIE o $_GET değerleri, $_POST alır olduğunu ve eğer Bir şeyler bazı yollar kodu ve kötü niyetli bir kullanıcı, beklenenden farklı bir yerde bir değer sağlayarak ve geçmek için çalışıyorlardı birini geçersiz kılarak bu yararlanmak Belirli geçersiz güvenen-istemci varsayımlar yapmak.

Bu da o $_REQUEST toplayıp olduğunu, bir GET veya COOKIE değer olabilir çünkü, uşak yanlış yönergeler vermiş olabilir anlamına gelir. Eğer gerçekten aradığınız değeri gösterir ne yer kullanmak, ille $_POST gerekir.

Çeşitli yanıtlar zaten belirtildiği gibi: Any data coming from the client cannot be trusted and must be treated as being malicious by default. Bu $_POST, $_GET, $_COOKIE ve $_REQUEST (eski kombinasyonunu), fakat diğerleri de içerir.

Diğerlerinden daha onları daha tehlikeli olma bazıları hakkında konuşurken I [(3)] üzerinden {dan (o $_GET içerir gibi) gerçekten $_GET, ayrı ve $_REQUEST olur } olarak it is slightly harder to generate, i.e. manipulate, a POST request than a GET request. Burada vurgu slightly, ancak hassas operasyonlar için POST kullanarak en az yararlanma düşük asılı meyve başka bir katman kaldırır.

O Cross Site Scripting (ya da XSS) ve çerez hırsızlığı söz konusu olduğunda, sadece bir manipüle URL ile gizli bir görüntü ekleyerek saldırı altında sunucuya bir GET isteği için bir kurbanın tarayıcısını almak oldukça kolaydır Bir sayfa veya bir bağlantı dövme.

Bir POST isteği vermeden en az (duruma göre) yürütülmesi için kurbanın tarayıcısında enjekte etmek slightly zordur bazı JavaScript gerektirir. Açıkçası POST istekleri doğrudan saldırganlar tarafından oluşturulan olabilir, bu nedenle onlar da güvenilir olamaz, ama bir saldırganın 3. parti tarayıcısı geçiyor senaryolar için, onlar işlemek için biraz zordur.

Dikkate vb uygulama kısıtlamaları alarak - Güvenlik uygulama kırmak için mümkün olduğunca sert yapma konusunda her zaman. Bu% 100 güvenli olma konusunda olamaz. Farklı uygulama yaklaşımları arasında seçim olan zaman böylece, choose the alternative which is more difficult to exploit, even if the difference is marginal için iyi bir uygulamadır.

Sonunda düşük asılı meyve kaldırma konusunda her zaman. Tabii, POST istekleri de manipüle edilebilir, ancak yüksek bir riski vardır herhangi bir işlem için, bir POST isteği kullanmak ve kod $_POST kullanarak kendinizi kısıtlamak. Zaten bazı çok kolay GET drive-by saldırıları hariç ve edenlere bu şekilde şimdi POST verilerini doğrularken odaklanabilirsiniz. Sadece POST kullanarak aniden varsayılan işlemi güvenli yapılmış olduğunu düşünmeyin.

İnsanların $_POST yerine $_REQUEST kullanımı anlatmak için kesinlikle tamam. Bu sizin veri alma nerede hakkında daha fazla emin olmak için her zaman daha iyidir.

@ Christian:

Onları (o $ _GET içerir gibi) onu üretmek için biraz daha zor olduğu gibi gerçekten, $ _POST dışarı $ _GET ayırmak ve $ _REQUEST olurdu diğerlerinden daha tehlikeli olma bazıları hakkında konuşurken, örneğin, bir GET isteği daha bir POST isteği işlemek . Burada vurgu hafifçe, ama hassas operasyonlar için POST kullanarak en az yararlanma düşük asılı meyve başka bir katman kaldırır.

Bzzt. Üzgünüm, ama bu sadece doğru değildir.

GET ve POST ya da nasıl sağlıksız girişler işletilebilir olabilir arasındaki farkı anlayan herkes, sabotaj Veri ateşlemek için bir saniye tereddüt etmeyecektir.

Bazı insanlar burada o var: iyi tasarlanmış bir sistemde $ _REQUEST kullanarak tarafından kaybedilen veya güvenlik yok.

Kullanarak $_POST ve $_REQUEST, eşit inceleme ile veri dezenfekte edilmelidir arasında gerçek bir güvenlik bir fark var.

$_REQUEST Bir POST'd formdan veri almak için çalışıyor olabilir, ama aynı adı taşıyan bir GET parametresi olabilir ile büyük sorun. Veri nereden gelecek? Bu açıkça bu örnekte bunu, $_POST beklediğiniz yerden veri istemek için en iyisi

slight güvenlik faydaları vardır - bunu gerçekleştirmek daha kolay XSS Eğer $_REQUEST kullanırsanız mümkündür GET parametreleri üzerinde (özellikle XSRF) saldırıları zaman gerçekten sadece POST veri istiyorum ..

Eğer POST ya veri gerektiğinde çok az durum var .. GET veya çerez, POST verileri almak GET parametreleri veri almak istiyorsanız, $_POST kullanmak, {[(1 kullanmak istiyorsanız Eğer çerez verilerini isterseniz)]}, {kullanın [(2)]}

En güvenli şekilde verileri doğrulamak ve doğrulamak için olduğunu. Ben genellikle bir form için rasgele benzersiz bir kimlik oluşturmak ve kullanıcının oturumunda depolamak, ama bu kolayca kararlı bir saldırgan tarafından atlanır. Çok daha iyi gelen tüm verileri temizlemek için. Htmlspecialchars () ve ilgili fonksiyonu kontrol edin. Ben de HTML Purfier gibi, çapraz site için bir üçüncü taraf yardımcı programını kullanın

Bazı pratik notlar üzerinde, her zaman, sayısal olarak tüm gelen dizeleri kaçış, telefon numaraları, e-posta veya bir SQL sorgusu parçası olacak bir şey için regex kullanmak için ne gerekiyor () intval kullanın.

Umarım bu yardımcı olur.