Crear página web que actúa como proxy HTTP en menos de un minuto con PHPproxy

PHProxy es un viejo proxy HTTP vía web escrito en PHP en 2007, su funcionalidad es la de esquivar posibles bloqueos de acceso a sitios web. Si el servidor donde está alojado PHPproxy puede acceder a un determinado recurso http, el cliente que lo utilice también.

PHProxy: http://sourceforge.net/projects/poxy/

Para su puesta en marcha se necesita como única dependencia el paquete php-cli. Se recomienda mirar las opciones de configuración de PHPproxy para adaptarlo a las necesidades.

wget http://switch.dl.sourceforge.net/project/poxy/PHProxy/0.5%20beta%202/poxy-0.5b2.zip
unzip poxy-0.5b2.zip
php -S 0.0.0.0:80

Proteger el acceso a PHProxy mediante autenticación HTTP Digest

Agregar justo después de “error_reporting(E_ALL);” el siguiente código (Cambiar usuario / password).

// function to parse the http auth header
function http_digest_parse($txt)
{
    // proteger contra datos perdidos
    $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
    $data = array();
    $keys = implode('|', array_keys($needed_parts));
 
    preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);
 
    foreach ($matches as $m) {
        $data[$m[1]] = $m[3] ? $m[3] : $m[4];
        unset($needed_parts[$m[1]]);
    }
 
    return $needed_parts ? false : $data;
}
 
 
$realm = 'Área restringida';
 
//user => password
$users = array('usuario1' => 'password1', 'usuario2' => 'password2');
 
 
if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$realm.
           '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
 
    die('Chao!');
}
 
 
// analiza la variable PHP_AUTH_DIGEST
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
    !isset($users[$data['username']]))
    die('Buen intento!');
 
 
// Generando una respuesta valida
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);
 
if ($data['response'] != $valid_response)
    die('Datos Erróneos!');