技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 网络系统 --> 代理的远程部分

代理的远程部分

浏览:2589次  出处信息

既然要,肯定要有一台墙外主机。为了配合加密,以及 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. 让安卓手机通过代理翻墙的方法    (阅读:7157)
  2. 关于 SOCKS 代理的远端 DNS 解析    (阅读:6420)
  3. 代理的加密部分    (阅读:4517)
  4. HTTP 正向代理与反向代理    (阅读:3904)
  5. 关于不得不在python中使用代理访问网络的方法    (阅读:3752)
  6. 将远程共享文件夹挂载到linux本地目录    (阅读:3608)
  7. nginx.conf控制指定的代理ip和ip访问的设置手记    (阅读:3491)
  8. 关于http代理    (阅读:3324)
  9. 使用 Perl 实现 HTTP 代理    (阅读:2897)
  10. socks5代理服务器的配置    (阅读:2898)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1