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($to07)!='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($urlPHP_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($urlPHP_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: '.$cookieFALSE);
        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($fp8192);
        
        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($fp8192);
        
        if(
strlen($tresc)>102400) {
            
$tresc .= '/* FILE TOO BIG */';
        }
    }
    
    echo 
rewrite_css($tresc);
}
else
{
    while (!
feof($fp)) {
        echo 
fread($fp8192);
    }
}
?>

Browse Code © 2010 by Jacek Kowalski