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