PHP: URL yönlendirmeleri olmadığını kontrol edin?

3 Cevap php

Ben kullanıcıların dışı oturum kısıtlamak istediğiniz her sayfada çalışan bir fonksiyonu hayata geçirdik. Fonksiyonu otomatik olarak he durumunda oturum açma sayfasına ziyaretçi yönlendirir ya da o oturum değil

Ben onlar yönlendirilir ya da olup olmadığını görmek için set URL'lerin bir dizi (korunan her site için URL'leri ile dizi) aracılığıyla exernal sunucu ve yineler çalıştırılan bir PHP işlevini yapmak istiyorum. Böylece ben kolayca Koruma aşağıdaki durumlarda devreye ve her sayfada çalışan ise emin olabilir.

Bu nasıl yapılabilir?

Teşekkürler.

3 Cevap

Bu gerçekten bir güvenlik kontrolünden olarak mantıklı emin değilim.

Eğer dosya olmadan doğrudan denilen alma konusunda endişeli iseniz sizin "oturum açmış kullanıcı nedir?" kontroller yürütülüyor, birçok büyük PHP projeler ne yapabilirdi: Central içinde define (burada güvenlik kontrolü yapılıyor) dosyasını dahil sabit bir BOOTSTRAP_LOADED veya ne olursa olsun, her dosyada, ister bu kontrol sürekli ayarlanır.

Test harika ve güvenlik testleri bile daha iyidir, ama ben bununla ortaya çıkarmak isteyen kusur ne tür emin değilim? Bana göre, bu fikir gerçek ek güvenlik getirmek değil zaman kaybı gibi geliyor.

Sadece komut die() s header("Location:...") yönlendirmek sonra emin olun. Bu başlık komutundan sonra görüntülenen ek içeriği durdurmak için esastır (yönlendirme başlığı hala ihraç edileceği gibi () yoluyla da fikir bir eksik kalıp yakalanmış olmaz, ...)

Eğer gerçekten bunu istiyorsanız, siz de wget gibi bir araç kullanmak ve bu URL'lerin bir listesini yem olabilir. Her sayfası oturum açma iletişim içerip içermediğini (aynı olmalıdır dosya boyutları bakarak örneğin) bir dizine sonuçları getir ve kontrol ettirin. Sadece başka bir seçenek eklemek için ...

Eğer bir yönlendirme olmadığını görmek için HTTP kodunu kontrol etmek istiyor musunuz?

    $params = array('http' => array(
        'method' => 'HEAD',
        'ignore_errors' => true
    ));

    $context = stream_context_create($params);
    foreach(array('http://google.com', 'http://stackoverflow.com') as $url) {
      $fp = fopen($url, 'rb', false, $context);
      $result = stream_get_contents($fp);

      if ($result === false) {
          throw new Exception("Could not read data from {$url}");
      } else if (! strstr($http_response_header[0], '301')) {
          // Do something here
      }
    }

Ben Adam Backstrom cevap değiştirilmiş ve chiborg önerisini hayata. (Sadece KAFASI indirin). Daha tek bir şey var: yönlendirme aynı sunucu bir sayfa içinde veya dışında olup olmadığı kontrol edecektir. Örnek: terra.com.br terra.com.br / portal yönlendirir. PHP yönlendirme gibi düşünceli olacak, ve bu doğru. Ama sadece başka bir URL'ye yönlendirmek olduğunu url listelemek istedim. Benim İngilizcem iyi değil, bu yüzden, birileri anlamak gerçekten zor bir şey buldum ve bu düzenleme eğer, buyrun.

function RedirectURL() {
    $urls = array('http://www.terra.com.br/','http://www.areiaebrita.com.br/');

    foreach ($urls as $url) {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        // chiborg suggestion
        curl_setopt($ch, CURLOPT_NOBODY, true);

        // ================================
        //  READ URL
        // ================================

        curl_setopt($ch, CURLOPT_URL, $url);
        $out = curl_exec($ch);

        // line endings is the wonkiest piece of this whole thing
        $out = str_replace("\r", "", $out);
        echo $out;

        $headers = explode("\n", $out);

        foreach($headers as $header) {
            if(substr(strtolower($header), 0, 9) == "location:") {
                // read URL to check if redirect to somepage on the server or another one.
                // terra.com.br redirect to terra.com.br/portal. it is valid.
                // but areiaebrita.com.br redirect to bwnet.com.br, and this is invalid.
                // what we want is to check if the address continues being terra.com.br or changes. if changes, prints on page.

                // if contains http, we will check if changes url or not.
                // some servers, to redirect to a folder available on it, redirect only citting the folder. Example: net11.com.br redirect only to /heiden

                // only execute if have http on location
                if ( strpos(strtolower($header), "http") !== false) {
                    $address = explode("/", $header);

                    print_r($address);
                    // $address['0'] = http
                    // $address['1'] = 
                    // $address['2'] = www.terra.com.br
                    // $address['3'] = portal 

                    echo "url (address from array) = " . $url . "<br>";
                    echo "address[2] = " . $address['2'] . "<br><br>";

                    // url: terra.com.br
                    // address['2'] = www.terra.com.br

                    // check if string terra.com.br is still available in www.terra.com.br. It indicates that server did not redirect to some page away from here.
                    if(strpos(strtolower($address['2']), strtolower($url)) !== false) {
                        echo "URL NOT REDIRECT";
                    } else {
                        // not the same. (areiaebrita)
                        echo "SORRY, URL REDIRECT WAS FOUND: " . $url;  
                    }
                }
            }
        }
    }
}