PHP: $ _SERVER ['HTTP_REFERER'] eşitliğini kontrol etmek için en iyi yolu nedir?

5 Cevap php

Ben HTTP Referer denetleyen bir PHP komut dosyası var.

if ($_SERVER['HTTP_REFERER'] == 'http://www.example.com/') {...}

Kullanıcı 'http://example.com/' veya 'http://www.ExaMple.com' (eşitlik testi eşleşmiyor her ikisi de) giderse ne olur Ancak, bu ... inherintly güvensiz görünüyor.

Question: HTTP Referer geliyor emin olmak için daha iyi bir eşitlik testi ne 'example.com'?

5 Cevap

parse_url() dize hokkabazlık biraz ile birlikte ne istediğinizi yapmanız gerekir. Bu deneyin:

$url = parse_url($_SERVER['HTTP_REFERER']);
//take the last two 'dot segments' of the host
$hostOnly = implode('.',array_slice(explode('.',$url['host']),-2));
if (strtolower($hostOnly) == 'example.com') {
    //stuff
}

() Kötü oluşturulmuş URL'ler başarısız olabilir, bu nedenle güvenli olması için kontrol bazı hata eklemek isteyebilirsiniz parse_url unutmayın. HTTP_REFERER kolayca önemsiz ile dolu olabilir.

Zorunlu tepkisi: HTTP_REFERER yüzden herkes, belirli bir web sitesinden gelen% 100 emin olmak için bir yolu yoktur sahte olabilir.

Bunu güvenmek istiyorum Ancak eğer http_referer "example.com" aramak için bir regex kullanabilirsiniz. stristr() de çalışacak ve daha hızlı bir regex sonra olacaktır çünkü muhtemelen tavsiye edilir. O example.com "yanı sıra" ExaMple.com "maç olurdu öyle duyarsız bir dava.

Size önemli bir şey için bunu kontrol kalmayız.

you can use parse_url() function to get hostname part and to check if HTTP_REFERER contain actually an url.
you can also just substr www. from hostname.
character case is not important as it's always lowercase

ya da bir regexpi kullanın.

Bir regex kullanarak, bu olacaktı

if(preg_match("%(http://)?(www\.)?example\.com(/)?%i",$_SERVER['HTTP_REFERER'])) { ... }
if (strtolower($_SERVER['HTTP_REFERER']) == 'http://www.example.com/') {...}

Nasıl hakkında ...

$parts = explode('/',$_SERVER['HTTP_REFERER']);
if (in_array('example.com',$parts) || in_array('www.example.com',$parts)) {...}