Ne $ _REQUEST [] kullanarak nesi var?

13 Cevap php

Ben $_REQUEST değişkeni kullanmak için değil diyerek burada mesajların bir dizi gördüm. Ben genellikle yoktur, fakat bazen daha uygundur. Bunun nesi yanlış?

13 Cevap

Kombine bir şekilde hem $_GET ve $_POST girdi alarak kesinlikle yanlış bir şey yok. Aslında bu hemen hemen her zaman yapmak istediğim şey:

  • genellikle GET yoluyla gönderilen düz İdempotent istek için, bir POST isteği yerine olarak pratik bir konuya mutasyona edildiğini böylece istediğiniz veri miktarı bir URL sığmaz bir olasılık var.

  • Gerçek bir etkiye sahip bir istek için, bunu POST yöntemi ile gönderilen olduğunu kontrol etmek gerekir. Ama bunu yapmak için yol $_SERVER['REQUEST_METHOD'] açıkça, $_POST, bir GET için boş olan dayanmaz kontrol etmektir. Yöntemi POST Ve eğer neyse, hala URL dışında bazı sorgu parametrelerini almak isteyebilirsiniz.

Hayır, birlikte problem $_REQUEST GET ve POST parametreleri conflating ile hiçbir alakası yoktur. O da, varsayılan olarak, $_COOKIE içerdiğini bulunuyor. Ve kurabiye gerçekten tüm form gönderme parametreleri gibi değil: Eğer aynı şey olarak onları tedavi etmek istiyorum hemen hemen hiç.

Eğer yanlışlıkla form parametrelerden biri olarak aynı adı ile sitenize bir çerez set alırsanız o parametre güveniyor formları gizemli nedeniyle beklenen parametreleri geçersiz cookie değerlerine düzgün çalışmayı durdurur. Bu aynı sitede birden fazla uygulamaları varsa yapmak çok kolaydır, ve sen hiçbir etrafında asılı ve şekillerde formları kırarak bir daha kullanmayın, eski kurabiye ile kullanıcılar sadece bir çift varsa ayıklamak çok zor olabilir -kimse üretebilir.

PHP 5.3 request_order yapılandırma ile çok daha mantıklı GP (hayır C) için bu davranışı değiştirebilirsiniz. Bunun mümkün olmadığı durumlarda, ben şahsen bir kombine GET + POST dizi gerekirse, elle oluşturun önlemek $_REQUEST ve olacaktır.

I PHP Internals bazı haber grubu mesaj yoluyla kazma ve konu hakkında ilginç bir tartışma bulundu oldum. Ilk dişli başka bir şey oldu, ama Stefan Esser, PHP dünyada bir (değilse the) güvenlik uzmanı tarafından bir açıklama bir kaç mesaj için $ _REQUEST kullanarak güvenlik yan etkileri doğru tartışma döndü.

Gerekçe Stefan Esser on PHP Internals

$_REQUEST is one of the biggest design weaknesses in PHP. Every application using $_REQUEST is most probably vulnerable to Delayed Cross Site Request Forgery problems. (This basically means if e.g. a cookie named (age) exists it will always overwrite the GET/POST content and therefore unwanted requests will be performed)

ve a later reply to the same thread in

It is not about the fact that someone can forge GET, POST; COOKIE variables. It is about the fact that COOKIEs will overwrite GET and POST data in REQUEST.

Therefore I could infect your browser with a cookie that says e.g. action=logout and from that day on you cannot use the application anymore because REQUEST[action] will be logout forever (until you manually delete the cookie).

And to infect you with a COOKIE is so simple...
a) I could use an XSS vuln in any application on a subdomain
b) Ever tried setting a cookie for *.co.uk or *.co.kr when you own a single domain there?
c) Other cross domain whatever ways...

And if you believe that this is not an issue then I can tell you that there is a simple possibility to set f.e. a *.co.kr cookie that results in several PHP versions just returning white pages. Imagine: Just a single cookie to kill all PHP pages in *.co.kr

And by setting an illegal session ID in a cookie valid for *.co.kr in a variable called +PHPSESSID=illegal you can still DOS every PHP application in korea using PHP sessions...

Tartışma birkaç ilanları için devam eder ve okumak ilginç.


Gördüğünüz gibi, $ _REQUEST ile temel sorun bu yüzden $ _GET ve $ _POST verileri olduğunu çok, ama aynı zamanda $ _COOKIE uzak değildir. Listedeki diğer bazı adamlar örneğin, $ _REQUEST dolu olduğu sırasını değiştirerek önerdi Önce $ _COOKIE ile doldurarak, ama this could lead to numerous other potential problems, for instance with Session handling.

Bu diğer dizilerin herhangi biri tarafından yazılmaz, böylece tamamen (aslında, PHP manual on the *variable_order* ini setting gibi, bu standart içeriği bulunuyor herhangi bir kombinasyonu için sınırlayabilir, ama $ _REQUEST küresel dan $ _COOKIES ihmal olabilir söyler:

variable_order değişken ayrıştırma (Get, Post, Çerez ve Sunucu, Çevre) EGPCS sırasını ayarlar. Variables_order "SP" olarak ayarlanmış Örneğin, daha sonra PHP $ _SERVER ve $ _POST oluşturmak, ama $ _ENV, $ _GET ve $ _COOKIE oluşturmaz. "" Ayarı yok superglobals ayarlanacağı anlamına gelir.

PHP Eğer, Çevre erişmek Get, Post, Çerez ve Sunucu kendi globalleri ve bir saldırı vektörü daha az olabilir çünkü ama sonra tekrar, aynı zamanda, tümüyle $ _REQUEST kullanarak değil düşünebilirsiniz. Hala bu verileri sterilize etmek zorunda, ama endişelenecek bir daha az şey.


Şimdi merak edebilirsiniz, neden $ _REQUEST sonuçta var ve neden bu kaldırılmaz. Bu aynı zamanda PHP Internals üzerinde istendi. Why does $_REQUEST exist? PHP Internals yaklaşık Rasmus Lerdorf gerekçe

The more stuff like this we remove, the harder it becomes for people to quickly move to newer, faster and more secure versions of PHP. That causes way more frustration for everyone than a few "ugly" legacy features. If there is a decent technical reason, performance or security, then we need to take a hard look at it. In this case, the thing we should be looking at isn't whether we should remove $_REQUEST but whether we should remove cookie data from it. Many configurations already do that, including all of my own, and there is a strong valid security reason for not including cookies in $_REQUEST. Most people use $_REQUEST to mean GET or POST, not realizing that it could also contain cookies and as such bad guys could potentially do some cookie injection tricks and break naive applications.

Anyway, hope that shed some light.

$_REQUEST (GET, POST vb.) Istekleri her türlü ifade eder. Bu bazen yararlıdır, ancak tam yöntemi ($ _GET, $ _POST, vb) belirtmek için genellikle daha iyidir.

$_REQUEST, genellikle basit-orta-karmaşıklığı veri dönüşümleri genellikle uygulama kodunda yapılan yerine SQL beyan olduğunu aynı nedenle zararlı olarak kabul edilir: Bazı programcılar emmek.

Bir yerde $_REQUEST kullanmak eğilimi eğer gibi, ben GET üzerinden bir şey yapabilir ki ben kullanıcılara neden benim (kötü niyetli) Sitesinde <img> etiketler kurma anlamına gelir POST aracılığıyla olabilir sessizce ürünleri satın almak için e-ticaret modülü içine giriş, ya da ben onları tehlikeli eylemleri ya da (muhtemelen benim için) hassas bilgilerin açığa neden olacaktır linklere tıklayınız neden olabilir.

Ancak, bu, çünkü bir acemi, ya da en azından deneyimsiz, PHP programcısı basit hatalar yapıyoruz. Ne tür veriler, uygun olduğunda ilk kapalı, biliyorum. Örneğin, ben urlkodçözümü, XML veya JSON yanıtları dönebilirsiniz bir web hizmeti var. Uygulama HTTP_ACCEPT başlığını kontrol ederek tepkisini nasıl şekilleneceğini karar verir, ancak format parametresini göndererek özellikle bir coerced edilebilir.

Format parametresi içeriğini kontrol ederken, bu faktörleri çok sayıda bağlı olarak, sorgu dizesi veya bir postData yoluyla gönderilen olabilir, en azından hangi çağıran uygulamalar ile "& format = json" karışık istediği olsun veya olmasın olmak onun isteği. Böyle bir şey yazmak zorunda beni kurtarır, çünkü bu durumda, $_REQUEST çok uygundur:

$format = isset($_POST['format']) ? $_POST['format'] 
    : (isset($_GET['format']) ? $_GET['format'] : null);

Ben çok daha ramble için gidiyor, ama doğası gereği tehlikeli olduğu için $_REQUEST kullanımı dissuaded değil söylemek yeterli değilim - bunun o anlamak ister, bunun sordu yapar tam olarak ne sadece bir araçtır etkileri ya da değil - bu soruna neden olan bir yoksul tembel ya da deneyimsiz programcı, yoksul tembel ya da bilgisiz bir karardır.

How to use $_REQUEST safely


  1. Know your data: Sen alırsınız ne tür veri olarak bazı beklenti var, bu yüzden buna göre sterilize edilmelidir. Bir veritabanı için veri? addslashes() ya da *_escape_string(). Kullanıcıya geri göstermek olacak? htmlentities() ya da htmlspecialchars(). Sayısal verileri bekliyor? is_numeric() veya ctype_digit(). Aslında, filter_input() ve ilgili fonksiyonlar hiçbir şey ama kontrol ve veri sterilize tasarlanmıştır. Her zaman bu araçları kullanın.
  2. Don't access user-supplied superglobals data directly. , Her zaman veri sanitasyon bir alışkanlık haline, ve sadece $post_clean olsa bile, değişkenleri temizlemek için veri taşımak. Alternatif olarak, superglobals doğrudan sadece temiz olabilir, ama anything doğrudan işaret olarak bunu yaparken, kolay kod güvenlik açıklarını nokta yapar çünkü ben ayrı bir değişken kullanarak savunucusu nedeni bir süper küresel ve dezenfekte değil eşdeğer tehlikeli bir hatası olarak kabul edilir.
  3. Know where you data should be coming from. Yukarıdaki benim örnek başvurma, tepki biçimi değişken GET veya POST aracılığıyla gönderilmesine izin mükemmel mantıklı. Ben de "eylem" değişken yöntemiyle ya yoluyla gönderilmesine izin. Bununla birlikte, the actions themselves have very specific requirements as to which HTTP Verb is acceptable. Fonksiyonlar, örneğin, o hizmet tarafından kullanılan veri değişiklikler yalnızca POST yoluyla gönderilebilir olun. (Örneğin dinamik olarak oluşturulan harita görüntüleri gibi) olmayan veya düşük ayrıcalık belirli veri türleri için istekleri yöntemi ya gelen isteklere yanıt olarak servis edilebilir.

Sonuç olarak, bu basit kuralı unutmayın:

SECURITY IS WHAT YOU MAKE IT, PEOPLE!

EDIT:

I strongly bobince tavsiyesi tavsiye: Eğer php.ini için "GP" in request_order parametresini ayarlayabilirsiniz eğer; O, hiçbir çerez bileşenidir. Cookie verisi sorgu dizesi veya postData karşılaştırılabilir kabul edilebilir neredeyse hiç gerektiği gibi olguların% 98 + bunun için hemen hemen hiçbir rasyonel akıl yoktur.

P.S., Anekdot!

Ben sadece bir süper küresel bir şekilde erişilebilir veri depolamak için $_REQUEST bir yer düşündüm bir programcı biliyordu. Önemli adları ve şifreleri, yolları dosyaları, bu isim ve $_REQUEST depolandı. Ben bu değişken nasıl davrandığını söyledim o (olmasa da komik yani, ne yazık ki) biraz şaşırdım. Söylemeye gerek yok, bu uygulama devrildi.

Istekleri idempotent edilmeli ve POST istekleri genellikle değildir GET. Bu demektir ki, $_GET ve $_POST, genellikle farklı şekillerde kullanılmalıdır veri.

Uygulama verileri kullanarak ise $_REQUEST, hem GET ve GET idempotence ihlal POST istekleri için aynı şekilde davranacaktır.

Bu belirsiz. Sen really olsun, bu yazıyı taşıyan bu yana veri sana ne kadar biliyor, ve çerez veri yok. Ben mutlaka need teslimat yöntemini bilmek ya da kısıtlamak sürece, her zaman kötü bir şey olduğunu düşünmüyorum.

Aslında ben onu kullanmak gibi. Size kullanmak için esneklik verir GET veya POST hangi yerine GET parametrelerini kullanabilirsiniz böylece zaman verilerin çoğu, POSTed, ancak bazen belirli bir arama linki söylemek istersiniz arama formları gibi şeyler için kullanışlı gelebilir .

Birçok diğer dillerde (örneğin ASP.NET) bakarsanız Ayrıca, hepsi de GET ve POST değişkenler arasında hiçbir ayrım yapmak.

ETA:

Ben COOKIE değerleri almak için İSTEĞİ hiç kullanmadım, ama ben Kyle Butt bu konuda bu yazıya yorum olarak büyük bir nokta yapar düşünüyorum. Bu COOKIE değerleri almak için TALEBİ kullanmak iyi bir fikir değildir. Ben o bunu eğer cross-site istek sahtecilik için bazı gerçek potansiyeli olduğunu doğru olduğuna inanıyorum.

Ayrıca, malzeme İSTEK yüklenmiş olur ki sipariş php.ini (variables_order ve request_order) yapılandırma parametreleri ile kontrol edilir. POST hem yoluyla geçirilen aynı değişkeni var ve aslında İSTEK içine alır hangisi, GET Yani, bu ini ayarlarına bağlıdır. Eğer belirli bir düzen bağlıdır ve bu ayarları farklı bunları olmak beklediğinizden daha yapılandırılırsa, bu taşınabilirlik etkileyebilir.

Bu GET ve ne zaman bir çerez kullanmanız POST, ne zaman kullanılacağını anlamak önemlidir. $ _REQUEST Ile, size aradığınız değeri onlardan herhangi birinden gelmiş olabilir. Bir POST veya GET veya bir COOKIE'den gelen değeri almak için bekliyoruz, bunun yerine $ _REQUEST belirli değişken kullanmak için kodunuzu okuma birinin daha bilgilendirici.

Başkası hepsi için farklı cross-site kuralları $ _REQUEST kullanırken ajax veri döndürmek eğer, savunmasız, örneğin, vardır, çünkü tüm POST ya da kurabiye GETler tarafından geçersiz olmak istemiyorum o da işaret bir çapraz site betik saldırı.

$_REQUEST kötü bir fikir değil kullanarak sadece zaman GET ile.

  • POST değerleri yüklemek için kullanırsanız, cross-site istek sahtekârlıklardan risk
  • Eğer çerez değerleri yüklemek için kullanırsanız, tekrar cross-site istek sahtekârlıklardan risk

Ve hatta GET ile, $_GET daha $_REQUEST ;) yazın kısadır

Ben size geçerli url veya hostname almak istiyorsanız kullanılır, ama aslında böyle Parmeters gibi bu URL'den veri ayrıştırma için ve kullanıyor olabilirsiniz sembolü muhtemelen iyi bir fikir değil. Genel olarak, yapmanız için çalışıyoruz ne belirsiz bir açıklama kullanmak istemiyorum. Eğer belirli olması gerekir yoksa, $ _REQUEST kötü olduğu bu özel olması gerekiyorsa o zaman bunu kullanmak için çekinmeyin. Ben düşünürdüm.

Ne istediğinizi veri biliyorsanız, açıkça bunun için sormalısınız. IMO, GET ve POST iki farklı hayvanlar ve ben hiç sonrası veri ve sorgu dizeleri karıştırmak gerekir neden iyi bir sebep düşünemiyorum. Herkes bir tane varsa, ben ilgi duyarım.

Bu komut aynı şekilde GET veya POST ya cevap ne zaman $ _REQUEST kullanmak daha uygun olabilir. Bu oldukça nadir bir durumdur olması gerektiğini olsa iddia ediyorum, ve çoğu durumda kontrol yöntemidir ve doğru değişkenleri seçerek iki ayrı kavram, ya da en azından işlemek için iki ayrı işlevleri tercih edilir. Program akışı genellikle değişkenlerin geliyor olabilir çapraz başvuru için gerekli değil zaman takip etmek çok daha kolaydır. 6 ay sürede kodunuzu korumak zorundadır kişiye nazik olun. Bu olabilir.

Kurabiye ve TALEP değişken çevre değişkenlerin neden güvenlik sorunları ve WTFs ek olarak (me GLOBAL başladı alamadım), PHP doğal gibi PUT gibi diğer yöntemlerle desteklenmesi ve SİL başladı eğer gelecekte neler olabileceğini düşünün. Bu TALEBİ süper küreseli birleştirilecek olacağını son derece olası olsa da, onlar variable_order ortamda seçeneği olarak dahil olabilir mümkündür. Yani gerçekten kod bir üçüncü taraf sunucusunda dağıtıldığında, özellikle tutan olursa olsun ne TALEP hiçbir fikrim yok, ve öncelik alarak ne.

POST GET daha güvenli midir? Gerçekten değil. Bu saldırıya aldığında uygulama istismar ediliyor nasıl günlükleri görmek kolay, çünkü pratik GET kullanmak daha iyidir. POST örümcekler genellikle onları takip yok, ve sizin CMS oturum açtığınızda akıllı getiriliyor mekanizmalar tüm içeriği silmek olmaz, çünkü etki alanı durumunu etkileyen operasyonlar için daha iyidir. Ancak, soru POST vs GET yararları hakkında, bu alıcının gelen verileri davranmalı ve onu neden birleştirmek için kötü konusunda değildi, bu yüzden bu gerçekten sadece bir MEZUNLARI olduğunu.

I $_REQUEST ile hiçbir sorun olduğunu düşünüyorum, ama 3 kaynaklardan (GPC) değişkenlerin bir koleksiyon beri kullanırken dikkatli olması gerekir.

I $_REQUEST yeni php sürümleri ile eski programlar uyumlu hale getirmek için hala kullanılabilir sanırım, ama biz (yeni kütüphaneler dahil), yeni projeler başlatmak eğer biz yapmak artık $_REQUEST kullanmak gerektiğini düşünüyorum net programları. $_REQUEST {[(4 kopyalarını içeren bu yana biz bile, özellikle büyük gönderilen metin veri işleme, $_REQUEST kullanımları silme ve programın açık yapmak için bir sarıcı işlevi ile yerine düşünmelisiniz )]}.

// delete $_REQUEST when program execute, the program would be lighter 
// when large text submitted
unset($_REQUEST);

// wrapper function to get request var
function GetRequest($key, $default = null, $source = '') 
{
  if ($source == 'get') {
    if (isset($_GET[$key])) { 
      return $_GET[$key]; 
    } else { 
      return $default; 
    }
  } else if ($source == 'post') {
    if (isset($_POST[$key])) { 
      return $_POST[$key]; 
    } else { 
      return $default; 
    }
  } else if ($source == 'cookie') {
    if (isset($_COOKIE[$key])) { 
      return $_COOKIE[$key]; 
    } else { 
      return $default; 
    }
  } else {
    // no source specified, then find in GPC
    if (isset($_GET[$key])) {
      return $_GET[$key];     
    } else if (isset($_POST[$key])) {
      return $_POST[$key]; 
    } else if (isset($_COOKIE[$key])) {
      return $_COOKIE[$key]; 
    } else {
      return $default; 
    } 
  }
}

Çok güvensiz. Bir POST veya GET, ya da başka bir istek alıyorsanız eğer bilmiyorsanız bu yana da garip. Uygulamalarınızı tasarlarken gerçekten aralarındaki farkı bilmek gerekir. GET URL içinde bulunuyor gibi çok güvensiz olduğunu ve sayfa navigasyon yanı sıra hemen hemen her şey için uygun değildir. POST, ya kendi başına ya da güvenli olmayan, safetey bir düzeyi sağlar.