Понякога ми се налага да използвам прокси, докато браузвам – предполагам и на вас. Дали защото някой умен системен администратор е забранил достъпа до 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]