IT技术博客大学习 共学习 共进步

代理的远程部分

BT的花 blogs 2010-04-01 08:56:51 浏览 3,164 次

既然要,肯定要有一台墙外主机。为了配合加密,以及 HTTP/HTTPS 协议代理,需要编译有 mcrypt 和 curl 的 PHP;在如今我估计这应该都属于web主机标配环境.

如果是文本数据,就加密后返回;如果非文本数据,就不加密了。返回给本地代理以第一个字符是"0" or "1"来指示接下来的数据是否经过加密。

配合其运行的代码见
代理的本地部分
代理的加密部分

PHP
$PASSWORD = "yourpasswordhere";
$pw_md5 = md5($PASSWORD, true);
$key = substr($pw_md5, 0, 8);
$iv = substr($pw_md5, 8, 8);

$input = file_get_contents("php://input");

$td = mcrypt_module_open('des', '', 'cbc', '');
mcrypt_generic_init($td, $key, $iv);
if (strlen($input) > 0 && $input % 8 == 0) {
        $input = strip_pkcs7("des", "cbc", mdecrypt_generic($td, $input));

        $req = explode("\r\n\r\n", $input, 3);

        $rawreqline = explode(" ", $req[0]);
        $url = parse_url($rawreqline[1]);

        $_headers = explode("\r\n", trim($req[1]));
        //$_headers[count($_headers)] = "X-Forwarded-For: ".$_SERVER['REMOTE_ADDR'];
        if ($url["scheme"] == "http" || $url["scheme"] == "https") {
                $ch = curl_init($rawreqline[1]);
                /*  avoid HTTP/1.1 Transfer-Encoding: chunked */
                curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
                curl_setopt($ch, CURLOPT_HTTPHEADER, $_headers);
                curl_setopt($ch, CURLOPT_HEADER, 1);
                if ($url["scheme"] == "https") {
                        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                }
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                if ($rawreqline[0] == "POST" && count($req) == 3) {
                        curl_setopt($ch, CURLOPT_POST, 1);
                        curl_setopt($ch, CURLOPT_POSTFIELDS, $req[2]);
                }
                $data = curl_exec($ch);

                curl_close($ch);
        }
        $text_mode = "0";

        $res = explode("\r\n\r\n", $data, 2);
        $header = explode("\r\n", $res[0], 2); // STATUS HEADER
        $headers = explode("\r\n", $header[1]);
        foreach ($headers as $hline) {
                $h = explode(":", $hline, 2);
                $k = strtolower(trim($h[0]));
                if ($k == "content-type" && strpos(strtolower(trim($h[1])), "text/") === 0) {
                        $text_mode = "1";
                        break;
                }
        }
        if ($text_mode == "1") {
                mcrypt_generic_deinit($td);
                mcrypt_generic_init($td, $key, $iv);
                $data = mcrypt_generic($td, padding_pkcs7("des", "cbc", $data));
        }
        $data = $text_mode . $data;
}
?>=$data?>

建议继续学习

  1. 让安卓手机通过代理翻墙的方法 (阅读 8,803)
  2. 代理的加密部分 (阅读 8,247)
  3. 关于 SOCKS 代理的远端 DNS 解析 (阅读 7,745)
  4. HTTP 正向代理与反向代理 (阅读 4,981)
  5. 关于不得不在python中使用代理访问网络的方法 (阅读 4,942)
  6. nginx.conf控制指定的代理ip和ip访问的设置手记 (阅读 4,627)
  7. 将远程共享文件夹挂载到linux本地目录 (阅读 4,525)
  8. 关于http代理 (阅读 4,524)
  9. 使用 Perl 实现 HTTP 代理 (阅读 4,005)
  10. socks5代理服务器的配置 (阅读 3,862)