Проверяване за прокси сървъри с php

Понякога ми се налага да използвам прокси, докато браузвам – предполагам и на вас. Дали защото някой умен системен администратор е забранил достъпа до vbox, youtube или други – без значение. В този случай отварям google и намирам някой сайт с прокси списъци, а такива има много и започвам да пробвам, докато не открия някое което наистина работи, защото повече от половината не стават. Така един ден, реших да си поиграя и да напиша скрипт, който да проверя за валидни proxy сървъри.
Скрипта се състои от две части – клиент и сървър. Стартираме сървъра на някоя машина, която е достъпна от интернет. Клиента ще се опита да използва проксито и да се свърже през него към сървъра. Ако успее, значи проксито работи. Същевременно се проверя, дали въпросното прокси е анонимно или не, т.е. дали показва ip адреса ни на сървъра. Добре е да се застраховам тук и да кажа, че кода по-долу е пускан един два пъти и като, че ли на пръв поглед работи. Не мога да гарантирам обаче, че няма бъгове, нито пък че това е оптималното решение на този проблем. Използвайте го, в случай че го намерите за полезен и не ме търсете ако благодарение на него ви се скапе компютъра.

proxy_server.php
[geshi lang=php]
$address = 'server.com';
$port = '3777';
set_time_limit(0);

$clients = array();
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($sock, $address, $port) or die('Couldn\'t bind to address');
socket_listen($sock);

while (true) {
$client = socket_accept($sock);
$input = socket_read($client, 1024);

if (stristr($input, 'x-forwarded-for') === false) {
$output = 'anon';
} else {
$output = 'notanon';
}

socket_write($client, $output);
socket_close($client);
}
socket_close($sock);
[/geshi]

proxy_client.php
[geshi lang=php]
$file_write = false;
if (in_array('--write', $argv)) {
$file_write = true;
$file = $argv[array_search('--write', $argv) + 1];

$fh = fopen($file, 'a+');
if ($fh == false) {
echo "Error: Invalid output file \n";
usage();
}
}

if (in_array('--url', $argv)) {
$server_url = $argv[array_search('--url', $argv) + 1];
} else {
echo "Error: Invalid server URL \n";
usage();
}

if (in_array('--from', $argv) && in_array('--to', $argv) && in_array('--ports', $argv)) {

$from = ip2long($argv[array_search('--from', $argv) + 1]);
$to = ip2long($argv[array_search('--to', $argv) + 1]);

if ($from >= $to) {
echo „Error: Invalid scan range \n“;
usage();
}

for ($i = array_search(‘–ports’, $argv) + 1; $i < count($argv); $i++) {
if (is_numeric($argv[$i])) {
$ports[] = $argv[$i];
} else {
break;
}
}

for($from; $from <= $to; $from++ ) {

$address = long2ip($from);
foreach ($ports as $port) {

$result = scan($address, $port, $server_url);
if ($result !== false && $file_write) {
fputs($fh, „$address:$port $result\n“);
}elseif ($result !== false) {
echo „$address:$port $result\n“;
}
}
}
} elseif (in_array(‘–list’, $argv)) {
$list = $argv[array_search('--list', $argv) + 1];

if (!file_exists($list) || !is_readable($list)) {
echo „Error: Invalid input file \n“;
usage();
}

$separator = ‘ ‘;
if (in_array(‘–separate’, $argv)) {
$separator = $argv[array_search('--separate', $argv) + 1];
}

$fh_list = fopen($list, ‘r’);
if ($fh_list) {
while (!feof($fh_list)) {
$line = fgets($fh_list);

if (empty($line)) {
continue;
}

$data = explode($separator, $line);

if (isset($data[0]) && !empty($data[0]) && isset($data[1]) && !empty($data[1])) {
$address = trim($data[0]);
$port = trim($data[1]);

$result = scan($address, $port, $server_url);
if ($result !== false && $file_write) {
fputs($fh, „$address:$port $result\n“);
}elseif ($result !== false) {
echo „$address:$port $result\n“;
}
}
}
}
} else {
usage();
}

if ($file_write) {
fclose($fh);
}

function usage() {
echo „proxy.php \n“;
echo „–url Proxy server URL\n“;
echo „–from IP address\n“;
echo „–to IP address\n“;
echo „–ports Scan only selected ports\n“;
echo „–write Save all proxies into the specified file\n“;
echo „–list Read the ip’s from a file\n“;
echo „–separate Default seperator is space. Use separate to specify another\n“;
exit();
}

function scan($proxy, $port, $url) {
$socket = @fsockopen($proxy, $port, $errno, $errstr, 2);
if ($socket == false) {
return false;
}

$out = „GET $url HTTP/1.1\r\n“;
$out .= „Host: $proxy\r\n“;
$out .= „Connection: Close\r\n\r\n“;
fwrite($socket, $out);

$result = “;
stream_set_timeout($socket, 5);
$info = stream_get_meta_data($socket);
while (!feof($socket) && !$info['timed_out']) {
$result .= fgets($socket, 128);
$info = stream_get_meta_data($socket);
}
fclose($socket);

if($result == ‘anon’ || $result == ‘notanon’) {
return $result;
} else {
return false;
}
}
[/geshi]

Сподели:
Edno23 Favit Svejo Twitter Facebook Google Buzz Delicious Google Bookmarks Digg
Публикувано в PHP. Постоянна връзка.

Вашият коментар

Вашият email адрес няма да бъде публикуван Задължителните полета са отбелязани с *

*

Можете да използвате тези HTML тагове и атрибути: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>