PodglÄ…d pliku: / phpproxy / index.php
<?php
/**************************************************
* Proxy w PHP *
**************************************************
* Wersja: 0.4 Alpha *
* Autor: Jacek Kowalski (http://jacekk.info) *
* *
* Utwór rozprowadzany na licencji *
* http://creativecommons.org/licenses/by-nc/2.5/ *
**************************************************/
ini_set('default_charset', '');
function glue_url($parsed) {
if(!is_array($parsed)) return false;
$uri = isset($parsed['scheme']) ? $parsed['scheme'].':'.((strtolower($parsed['scheme']) == 'mailto') ? '':'//'): '';
$uri .= isset($parsed['user']) ? $parsed['user'].($parsed['pass']? ':'.$parsed['pass']:'').'@':'';
$uri .= isset($parsed['host']) ? $parsed['host'] : '';
$uri .= isset($parsed['port']) ? ':'.$parsed['port'] : '';
if(isset($parsed['path'])) {
$uri .= (substr($parsed['path'],0,1) == '/')?$parsed['path']:'/'.$parsed['path'];
}
$uri .= isset($parsed['query']) ? '?'.$parsed['query'] : '';
$uri .= isset($parsed['fragment']) ? '#'.$parsed['fragment'] : '';
return $uri;
}
function simple_path_adv($path) {
$path = explode('/', simple_path($path));
$new_path = array();
foreach($path as $key => $value) {
switch($value) {
case '..':
array_pop($new_path);
break;
case '':
case '.':
break;
default:
$new_path[] = $value;
break;
}
}
return '/'.implode('/', $new_path);
}
function simple_path($path) {
$path = trim(str_replace(array('/./', '//', '\\'), '/', $path), '/');
while(strpos($path, '//')!==FALSE OR strpos($path, '/./')!==FALSE) {
$path = str_replace(array('/./', '//', '\\'), '/', $path);
}
return '/'.$path;
}
function dir_name($path) {
if(substr($path, -1)!='/') {
return dirname($path);
}
else
{
return $path;
}
}
function base_path($start, $rel) {
$start = explode('/', simple_path_adv($start));
$rel = explode('/', $rel);
if($rel[0]=='') {
$start = array();
}
foreach($rel as $value) {
switch($value) {
case '..':
array_pop($start);
break;
case '':
case '.':
break;
default:
$start[] = $value;
break;
}
}
return implode('/', $start);
}
function rewrite_html($text) {
$tags = array(
'a' => 'href',
'img' => 'src',
'link' => 'href',
'script' => 'src',
'form' => 'action',
'embed' => 'src'
);
foreach($tags as $key => $value) {
$text = preg_replace_callback("/(<".$key." .*?".$value.".*?=.*?\")(.*?)(\".*?>)/", replacer_html, $text);
}
return $text;
}
function rewrite_css($text) {
$tags = array(
'url(' => ')',
);
foreach($tags as $key => $value) {
$text = preg_replace_callback("/(url\()([^\)]*)(\))/", replacer_css, $text);
}
return $text;
}
function replacer_html($m) {
global $url;
$m[2] = trim($m[2], "\r\n\t\0".' "\'');
return $m[1].makelink($m[2], $url).$m[3];
}
function replacer_css($m) {
global $url;
$m[2] = trim($m[2], "\r\n\t\0".' "\'');
return 'url(\''.makelink($m[2], $url).'\')';
}
function makelink($to, $link) {
if(substr($to, 0, 7)!='http://') {
$link = parse_url($link);
$link['path'] = ltrim(base_path(dir_name($link['path']), $to), '/');
$to = glue_url($link);
}
return './?u='.base64_encode($to);
}
function str_replace_limit($search, $replace, $subject, $limit=-1) {
if (is_array($search)) {
foreach ($search as $k=>$v) {
$search[$k] = '`' . preg_quote($search[$k],'`') . '`';
}
}
else {
$search = '`' . preg_quote($search,'`') . '`';
}
return preg_replace($search, $replace, $subject, $limit);
}
function form($address='http://') {
return '<script type="text/javascript" src="js.js"></script>
<div style="background:#fff; color:#000; border:1px solid black; display:block; position:fixed; bottom:0px;right:0px; left:0px; height:25px;"><form method="get" onsubmit="document.getElementById(\'u\').value=base64_encode(document.getElementById(\'u\').value)">URL: <input type="text" id="u" name="u" value="'.htmlspecialchars($address).'" /> <input type="submit" value="Go" /></form></div>';
}
if(!empty($_GET['u'])) {
$url = base64_decode($_GET['u']);
}
else
{
die('No URL!'.form());
}
if(parse_url($url, PHP_URL_SCHEME)!='http') {
die('Wrong scheme (not http)'.form());
}
if(strtoupper($_SERVER['REQUEST_METHOD'])!='GET' AND strtoupper($_SERVER['REQUEST_METHOD'])!='POST') {
die('Wrong method (not GET or POST)'.form());
}
$host = parse_url($url, PHP_URL_HOST);
$header .= !empty($_COOKIE[$host]) ? 'Cookie: '.http_build_query($_COOKIE[$host], '', '; ') : '';
$header .= isset($_SERVER['HTTP_ACCEPT']) ? "\r\n".'Accept: '.$_SERVER['HTTP_ACCEPT'] : '';
$header .= isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? "\r\n".'Accept-Language: '.$_SERVER['HTTP_ACCEPT_LANGUAGE'] : '';
$header .= isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? "\r\n".'Accept-Encoding: '.$_SERVER['HTTP_ACCEPT_ENCODING'] : '';
$header .= isset($_SERVER['HTTP_AUTHORIZATION']) ? "\r\n".'Authorization: '.$_SERVER['HTTP_AUTHORIZATION'] : '';
$header .= isset($_SERVER['HTTP_CONTENT_TYPE']) ? "\r\n".'Content-Type: '.$_SERVER['HTTP_CONTENT_TYPE'] : '';
$header .= isset($_SERVER['HTTP_RANGE']) ? "\r\n".'Range: '.$_SERVER['HTTP_RANGE'] : '';
$header .= isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? "\r\n".'If-Modified-Since: '.$_SERVER['HTTP_IF_MODIFIED_SINCE'] : '';
$header = 'User-Agent: PrivProx/1.0'."\r\n".'Connection: close'."\r\n".'X-Forwarded-For: '.$_SERVER['REMOTE_ADDR'];
$context = stream_context_create(
array(
'http' => array(
'method' => strtoupper($_SERVER['REQUEST_METHOD']),
'header' => $header,
'protocol_version' => '1.0',
'content' => file_get_contents('php://input'),
)
)
);
$fp = fopen($url, 'r', FALSE, $context);
if(!$fp) {
die('Cannot setup connection');
}
$header = stream_get_meta_data($fp);
$header = $header['wrapper_data'];
foreach($header as $value) {
$head = explode(':', strtolower(trim($value)), 2);
$head[0] = trim($head[0]);
$head[1] = trim($head[1]);
if($head[0]=='content-type') {
if(strpos($head[1], ';')!==FALSE) {
$type = explode(';', $head[1], 2);
$type = trim($type[0]);
}
else
{
$type = $head[1];
}
if($type=='text/html' OR $type=='application/xhtml+xml') {
$html = TRUE;
}
elseif($type=='text/css') {
$css = TRUE;
}
}
elseif($head[0]=='set-cookie') {
$cookie = explode(';', $head[1]);
$cookie[0] = explode('=', trim($cookie[0]), 2);
if(strpos($cookie[0][0], '[')!==FALSE) {
$cookie[0][0] = str_replace_limit('[', '][', $cookie[0][0], 1);
}
else
{
$cookie[0][0] .= ']';
}
$cookie[0][0] = $host.'['.$cookie[0][0];
$cookie[0] = implode('=', $cookie[0]);
$cookie = $cookie[0].';'.$cookie[1];
header('Set-Cookie: '.$cookie, FALSE);
continue;
}
elseif($head[0]=='location') {
header('HTTP/1.1 302 Found');
header('Location: '.make_link($head[1], $url));
die();
}
header($value);
}
if($html === TRUE) {
while (!feof($fp)) {
$tresc .= fread($fp, 8192);
if(strlen($tresc)>102400) {
$tresc .= '<!-- --> <!-- FILE TOO BIG -->';
}
}
echo str_replace_limit('</body>', form($url).'</body>', rewrite_html($tresc), 1);
}
elseif($css === TRUE) {
while (!feof($fp)) {
$tresc .= fread($fp, 8192);
if(strlen($tresc)>102400) {
$tresc .= '/* FILE TOO BIG */';
}
}
echo rewrite_css($tresc);
}
else
{
while (!feof($fp)) {
echo fread($fp, 8192);
}
}
?>
Browse Code © 2010 by Jacek Kowalski