Pewnie dużo osób się zastanawiało jak zabezpieczyć się przed proxy. Dzisiaj jakoś mnie natchnienie wzięło i przeszukałem zmienną globalną $_SERVER i znalazłem kilka wpisów które różnią się od normalnego wejścia, a wejścia z proxy.
Kod pozwoli ci się zabezpieczyć przed proxy typu Hitfaker i HTTP.$_SERVER['SERVER_PROTOCOL'] - pokazuje protokoł przeglądarki
$_SERVER['HTTP_CONNECTION'] - sam nie wiem
$_SERVER['HTTP_ACCEPT_LANGUAGE'] - zwraca język danej przeglądarki
$_SERVER['HTTP_ACCEPT_ENCODING']- zwraca szyfrowanie(ewentualnie)
To są te zmienne.
I teraz jak to zastosować w praktyce?
No tak! Możemy użyć prostych if'ów(zapytań).
Najpierw zamienimy zmienne globalne w lokalne i wszystko damy sobie w funkcje aby kod był bardziej przejrzysty.
function wykryj(){
$proto = $_SERVER['SERVER_PROTOCOL'];
$conn = $_SERVER['HTTP_CONNECTION'];
$langua = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$accept = $_SERVER['HTTP_ACCEPT_ENCODING'];
}
Teraz stworzymy jądro skryptu(ify).
No to najpierw zrobimy trudniejsze zapytanie. Zajmiemy się zmienną $_SERVER['HTTP_ACCEPT_ENCODING']
function wykryj(){
$proto = $_SERVER['SERVER_PROTOCOL'];
$conn = $_SERVER['HTTP_CONNECTION'];
$langua = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$accept = $_SERVER['HTTP_ACCEPT_ENCODING'];
$proxy = 0;
// zmienna która będzie zwracać funkcja
$aha = "gzip";
$strpos = strpos($accept,$aha); // funkcja szuka w stringu jeżeli go nie znajdzie to zwróci false
if($strpos === false){
$proxy = 1;
}
}
To teraz dodamy zmienną $_SERVER['SERVER_PROTOCOL']. Na zwykłych przeglądarkach zwraca on HTTP/1.1 . Na proxy zwraca czasami HTTP/1.0 . Więc to już cos (IMG:
style_emoticons/default/smile.gif)
function wykryj(){
$proto = $_SERVER['SERVER_PROTOCOL'];
$conn = $_SERVER['HTTP_CONNECTION'];
$langua = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$accept = $_SERVER['HTTP_ACCEPT_ENCODING'];
$proxy = 0;
// zmienna która będzie zwracać funkcja
$aha = "gzip";
$strpos = strpos($accept,$aha); // funkcja szuka w stringu jeżeli go nie znajdzie to zwróci false
if($strpos === false){
$proxy = 1;
}
elseif($proto != "HTTP/1.1")
{
$proxy = 1;
}
}
Dobra, dodaliśmy 2 zabezpieczenia, zostały ostatnie 2. Zrobimy Connection(normalnie zwraca "Keep-Alive", na proxy albo nic nie zwróci lub "close") i LANGUAGE(Zwraca język przeglądarki).
function wykryj(){
$proto = $_SERVER['SERVER_PROTOCOL'];
$conn = $_SERVER['HTTP_CONNECTION'];
$langua = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$accept = $_SERVER['HTTP_ACCEPT_ENCODING'];
$proxy = 0;
// zmienna która będzie zwracać funkcja
$aha = "gzip";
$strpos = strpos($accept,$aha); // funkcja szuka w stringu jeżeli go nie znajdzie to zwróci false
if($strpos === false){
$proxy = 1;
}
elseif($proto != "HTTP/1.1")
{
$proxy = 1;
}
elseif($conn == ""){
$proxy = 1;
}
elseif($langua == ""){
$proxy = 1;
}
}
I można powiedzieć że to już koniec, jeszcze dodamy return i upiększymy trochę kodzik.
function wykryj(){
$proto = $_SERVER['SERVER_PROTOCOL'];
$conn = $_SERVER['HTTP_CONNECTION'];
$langua = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$accept = $_SERVER['HTTP_ACCEPT_ENCODING'];
$proxy = 0;
// zmienna która będzie zwracać funkcja
$aha = "gzip";
$strpos = strpos($accept,$aha); // funkcja szuka w stringu jeżeli go nie znajdzie to zwróci false
if($strpos === false){
$proxy = 1;
}
elseif($proto != "HTTP/1.1")
{
$proxy = 1;
}
elseif($conn == ""){
$proxy = 1;
}
elseif($langua == ""){
$proxy = 1;
}
return $proxy;
}
Pamiętajcie aby użyć elseif a nie dawać kolejne if'y. Zwykłymi ifami dałoby rade lecz po co sobie utrudniać życie.
To zostało nam tylko użyć naszej funkcji.
function wykryj(){
$proto = $_SERVER['SERVER_PROTOCOL'];
$conn = $_SERVER['HTTP_CONNECTION'];
$langua = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$accept = $_SERVER['HTTP_ACCEPT_ENCODING'];
$proxy = 0;
// zmienna która będzie zwracać funkcja
$aha = "gzip";
$strpos = strpos($accept,$aha); // funkcja szuka w stringu jeżeli go nie znajdzie to zwróci false
if($strpos === false){
$proxy = 1;
}
elseif($proto != "HTTP/1.1")
{
$proxy = 1;
}
elseif($conn == ""){
$proxy = 1;
}
elseif($langua == ""){
$proxy = 1;
}
//tutaj ew. można napisać co ma zrobić jak nie będzie proxy
$t = $_SERVER['REMOTE_ADDR'];
$cz = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$temp = mysql_query("INSERT INTO `lnazwa bazy`.`nazwa tabeli` ( `SERVER_PROTOCOL` ,
`REMOTE_ADDR` ,
`HOST` ,
`HTTP_CONNECTION`,
`HTTP_ACCEPT_ENCODING`,
`HTTP_ACCEPT_LANGUAGE`,
`proxy`
)
VALUES (
'$proto', '$t', '$cz', '$conn','$langua','$accept','$proxy'
return $proxy;
}
$wyk = wykryj();
if($wyk == 0){
echo "Nie wykryto proxy"; }
else
{
}
Można też zrobić tak(sposób Pawel_W)
function wykryj(){
$proto = $_SERVER['SERVER_PROTOCOL'];
$conn = $_SERVER['HTTP_CONNECTION'];
$langua = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$accept = $_SERVER['HTTP_ACCEPT_ENCODING'];
$proxy = 0;
// zmienna która będzie zwracać funkcja
$aha = "gzip";
$strpos = strpos($accept,$aha); // funkcja szuka w stringu jeżeli go nie znajdzie to zwróci false
if($strpos === false || $proto != "HTTP/1.1" || $p == "" || $s == ""){
$proxy = 1;
}
//tutaj ew. można napisać co ma zrobić jak nie będzie proxy
$t = $_SERVER['REMOTE_ADDR'];
$cz = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$temp = mysql_query("INSERT INTO `lnazwa bazy`.`nazwa tabeli` ( `SERVER_PROTOCOL` ,
`REMOTE_ADDR` ,
`HOST` ,
`HTTP_CONNECTION`,
`HTTP_ACCEPT_ENCODING`,
`HTTP_ACCEPT_LANGUAGE`,
`proxy`
)
VALUES (
'$proto', '$t', '$cz', '$conn','$langua','$accept','$proxy'
return $proxy;
}
$wyk = wykryj();
if($wyk == 0){
echo "Nie wykryto proxy"; }
else
{
}
Mój system na 3 240 proxy przepuścił tylko jedno, więc to już coś (IMG:
style_emoticons/default/smile.gif)
Podziękowania dla Pigola który pomógł mi w tym temacie (IMG:
style_emoticons/default/wink.gif)
Temat: Szukanie w stringu danego tekstuZdjęcia bazy
(IMG:
http://iv.pl/images/13259010426311640687.jpg)
(IMG:
http://iv.pl/images/48001239593962469983.jpg)
A tutaj krótki filmik (IMG:
style_emoticons/default/smile.gif)
http://www.youtube.com/watch?v=eLT1aJSyBiEpo chwili(rezultat bombardowania proxami)
http://www.youtube.com/watch?v=r-15YK5nAHwJestem nowy w php więc jeżeli coś jest nie tak to prosiłbym o poprawienie.
Fajnie gdyby temat został podpięty, mało osób wie jak się zabezpieczyć "porządnie" przed proxy.
Kod i tutka napisałem samemu, nie pozwalam na kopiowanie.
Ten post edytował jackraymund 4.07.2011, 11:27:43