PHP header ('Location ..') yönlendirmesiyle 'exit' aramak zorunda Neden?

6 Cevap php

Eğer PHP bir kullanıcıyı yönlendirmek istiyorsanız başlık işlevini kullanabilirsiniz biliyorum:

header('Location: http://smowhere.com');

Aynı zamanda iyi diğer php kod yürütülmesini önlemek için, header çağrısından sonra da exit; koymak için iyi bir uygulama olduğu bilinmektedir. Benim soru yani: header-konum görüşmeden sonra kod etkili idam olabilir? Hangi durumlarda? Kötü niyetli bir kullanıcı tamamen diyoruz header('Location..') göz ardı etmek mümkün olabilir mi? Nasıl?

6 Cevap

header-konum görüşmeden sonra kod etkili idam olabilir?

Evet, her zaman. header yönlendirmek için veri asking tarayıcı sadece bir çizgidir. Sayfanın geri kalanı will still be served PHP tarafından ve sadece yürütülmesini header komutunu önleyerek müşteri tarafından baktı olabilir.

Bu sadece yönlendirmeleri takip etmek değil onu söylüyorum, örneğin, wget gibi bir komut satırı istemcisi ile yapmak için yeterince kolaydır.

Bottom line: bunu önlemek yoksa, PHP hatta bir header çağrısından sonra bütün vücudu dışarı göndereceğiz. Bu vücut herhangi bir özel beceri olmadan hack alıcıya tam olarak mevcuttur.

Eğer yönlendirmek ancak eğer yapmak değil die() / exit() the code is always executed and displayed.

Aşağıdaki örneği ele alalım:

admin.php:

if (authenticationFails)
{
    // redirect and don't die
}

// show admin stuff

Eğer konum başlığından sonra çalışmasını sonlandırmak için emin olun yoksa every kullanıcı erişim kazanacaktır.

header() HTTP başlıklarını gönderilir zaman ... HTTP başlık gönderilmesi gerektiğini PHP bildirir.

Ve o sen () header için çağrı yazdığınızda anında gönderilir değil, ama onları göndermek için zamanı geldiğinde (typically, when PHP needs to begin sending the body of the response -- which might be later than you think, when output_buffering ) enabed edilir.

Sadece header() ararsanız, bu açıklamasının ardından yazılı kodu yürütülmez ki ne garantisi absolutly var - o olmalı değil, kullanarak exit / {işaret olmadıkça [(2)]}.

O isterse kullanıcı Location başlık yok sayabilirsiniz; ama bunun çağrısından sonra kod header() ya da idam olmayabilir olabileceği gerçeği üzerinde hiçbir değişiklik olmaz: bu konuda sunucu tarafı.

Bir başlığından sonra PHP Kodu () çalıştırmak olacaktır. Bazen, bu example olarak php.net şovlarda olsa gereklidir. Emin değil yapmak için, tamamen program akışını sona erdirmek.

re: could the code after the header-location call be effectively executed?

Evet eğer komut kapatmayın.

re: In which cases?

Her durumda.

Can a malicious user be able to completely ignore the header('Location..') call?

Hayır, kullanıcı hiçbir konuda söz vardır derbiye alacak.

Çıkış çağrısı olmadan, komut sonlandırılacak hangi kesin nokta / zaman iki faktöre aşağı gelecektir:

  1. Istemci tarayıcı yönlendirme nasıl tepki vereceğini çabuk
  2. Bu yürütmek için senaryonun kalanını alır ne kadar zaman.

Adlı tarayıcı HEMEN yönlendirme eylemini o Konum başlığı ile gelmek gördüğü an başlar diyelim. İşte bu yönlendirme geldiği bağlantıyı kapanacaktır, bu yüzden yeni konuma bağlantı başlatmak anlamına gelir. Bu genellikle web sunucusu yönlendirme komut sona anlamına gelir. Ancak uzun başlık sunucu> istemci ve istemci-> sunucu gitmek için TCP bağlantı kapatma işlemi gitmek için alır script yayınlanmaya devam hangi zaman miktarıdır.