# 分析了443个免费代理 其中只有21％没有黑幕 那么剩下的79%呢

- URL: https://wuming.si/blog/997/
- Author: Aaron
- Published: 2015-06-26
- Language: zh-Hans
- Categories: Uncategorized
- Originally published at: http://blog.wo.ai/archives/997

我的web服务－[Proxy Checker](https://proxycheck.haschek.at/)现在正式上线了！你可以使用它来测试代理服务器的安全性。源代码将会在稍后公布出来。

由于我于2013年所发表的文章《[为什么免费的代理会是免费的？](https://blog.haschek.at/post/fd9bc)》在Reddit网上收到了广泛的好评，所以我决定我将继续发表一篇相关文章。这一次，我将会尝试寻找一种使用了我在文章中所描述技术的代理服务。

所以，我写了一个非常简易的脚本(实际上是一个php函数),这个脚本会从不同的地方调用各种Javascript脚本文件，并且通过这些文件来检查修改过的内容。

如果你对代码不感兴趣，你可以跳转至扫描部分。

我所说的“非常简易”，是真的非常简易，因为下面的代码就是整个函数：
    
    
    function scanProxy($proxy,$url,$socks=true,$timeout=10) { 
    $ch = curl_init($url); 
    $headers["User-Agent"] = "Proxyscanner/1.0"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_HEADER, 0); //we don't need headers in our output 
    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,$timeout); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //return output as string 
    $proxytype = ($socks?CURLPROXY_SOCKS5:CURLPROXY_HTTP); //socks or http proxy? 
    if($proxy) { 
    curl_setopt($ch, CURLOPT_PROXY, $proxy); curl_setopt($ch, CURLOPT_PROXYTYPE, $proxytype); 
    } 
    $out = curl_exec($ch); 
    curl_close($ch); 
    return trim($out); 
    }

如果你需要查看我在扫描时所使用的完整脚本文件，你可以点击这里获取。我没有为大家提供一个代理服务的列表，但是获得这样的一个列表并不是什么难事。

我最近正在开发一个开源的web端服务，该服务名为Proxy Check,它正是基于这个函数而开发的。在网站上，你可以测试你在网上所找到的代理。我计划过几天将这个服务上线。

如果需要测试代理服务，你仅仅需要将代理的文件/脚本/图片/页面等数据的URL地址递交上去，然后它将会把测试数据返回给你。

下面是一个简单的使用示例：
    
    
    //requesting a JS file from this blog 
    $proxy_data=scanProxy('127.0.0.1:9050','https://blog.haschek.at/js/blog.js'); 
    //requesting reference data so we can check if something is altered 
    $reference_data=scanProxy(false,'https://blog.haschek.at/js/blog.js'); 
    if(($proxy_data!=$reference_data) && $reference_data) //if the data is different but the proxy has sent something 
    echo "[!] Proxy modified the content!\n"; 
    else if(!$reference_data) 
    echo "[-] Proxy is down\n"; 
    else 
    echo "[+] Proxy did not modify the content\n";

你可以通过使用这个函数，来完成各种各样的分析和测试

  * 你可以通过访问网站<http://ip.haschek.at>来查看代理是否隐藏了你的IP地址，该网站会显示出你的IP地址，并且你可以通过查询相关参考数据来确定这个IP地址是否与你的公共IP地址相同。
  * 检查代理是否使用了HTTPS隧道通信。如果没有使用，那么可能是因为服务器的所有者只需要得到明文信息，以便于他们从你的通信信息中提取出相关的数据。
  * 检测代理是否向静态网站中添加了任何的数据信息(例如：广告)

让我们来对443个免费代理进行检测

我从各种地方收集到了大量的代理，但我通过Google搜索发现，所有的这些代理都指向了某些固定站点。

我们到底需要检测什么？

  * 是否允许使用HTTPS？
  * JS脚本是否被修改？
  * 静态网站页面内容是否被修改？
  * 代理会隐藏我的IP地址吗？

检测结果

**测试 结果**

测试数量 443(100%)

线上 199(44.9%)

线下 244(55.1%)

未使用HTTPS 157(79%)

JS文件被修改 17(8.5%)

HTML页面被修改 33(16.6%)

没有隐藏IP地址 0(0%)

网页内容没有修改 149(75%)

所以，75%的代理都是安全的，对吗？

代理没有修改你的数据内容，并不意味着它就是安全的。如果你想要安全地使用一个免费代理，唯一的方法就是使用支持HTTPS的代理，并且只访问强制使用HTTPS的网站。但是，目前仅有21%的代理支持HTTPS通信。

**结果**

网上免费的代理服务器往往是离线的，这并不令人惊讶，但是我并不希望这么多的代理服务器都将HTTPS通信禁止了。他们禁止HTTPS通信是有原因的，因为他们想要用户去使用HTTP进行通信，这样他们便可以分析你的通讯信息，并且窃取你的登录信息了。

在上述的199(8.5%)个代理里面，仅有17个代理修改了JS脚本，而且其中大多数的代理是为了向客户页面注入广告。但是其中有两个网站的修改信息却是错误数据或者网页过滤器的警告信息。

有33个代理服务器(16.6%)修改了静态HTML网页信息并且 注入了广告。其中，大多数的代理服务器在脚本结束标签之前注入了下列的代码：

`<link rel="stylesheet" type="text/css" href="http://ads.adt100.com/css/bottom.css" /><div id="center_xad" class="cwindow_xad"><div class="center_title_xad" id="center_title_xad"><img onclick="closeWindow()" width="39px" id="cwindow_xclose" height="11px" src="http://ads.adt100.com/images/close_btn.gif"></div><div id="center_xad_cnt" class="injection_content"></div></div><div id="right_xad" class="window_xad"><div class="right_title_xad" id="right_title_xad"><img onclick="closeWindow()" id="cwindow_rclose" width="39px" height="11px" src="http://ads.adt100.com/images/close_btn.gif"></div><div id="right_xad_cnt" class="injection_content"></div></div><script src="http://ads.adt100.com/js/bottom.js"></script>`

这绝对是恶意广告软件，而且还有可能会导致cookie被窃取。我并没有对这些代码进行进一步的研究，但是如果你想要对它们进行研究，那么当你有任何发现的时候，请你告知我。

其他代理服务的广告注入则显得更加的隐蔽。他们在页面头部插入了一个脚本标签，如下所示：

`<script type="text/javascript" charset="utf-8" mediaproAccountID="0" mediaproSlotID="0" usermac="" src="/7b26d4601fbe440b35e496a0fcfa15f7/00212600d7e6/w1/i.js" async="async" defer></script><meta charset="utf-8">`

在这里，有趣的事情就是这些代码看似指向一个本地的JS脚本文件。当浏览器通过代理请求调用这个文件的时候，代理会劫持这个请求，并且以受感染的JS文件进行回应。正如其他的链接一样，这并不是一个跨域JS链接，这样做非常的聪明。

如果你依旧认为你必须使用这些免费的代理服务，那么请你尝试使用支持HTTPS通信的代理服务，并且尽量只浏览那些安全性能够得到保障的网站。

### 相关文章

  * [DDoS攻防战（二）：CC攻击工具实现与防御理论](http://blog.jobbole.com/72928/)
  * [几种极其隐蔽的XSS注入的防护](http://blog.jobbole.com/26064/)
  * [我是如何反编译D-Link路由器固件程序并发现其后门](http://blog.jobbole.com/49959/)
  * [大型网站的 HTTPS 实践（4）：协议层以外的实践](http://blog.jobbole.com/86670/)
  * [我是如何在腾达路由器固件程序上发现漏洞的](http://blog.jobbole.com/52181/)
  * [Linux鲜为人知的安全漏洞：不要将输出内容管道给你的shell](http://blog.jobbole.com/63818/)
  * [通过 Facebook Notes 可以 DDOS 攻击任何网站](http://blog.jobbole.com/69324/)
  * [图解HTTPS](http://blog.jobbole.com/1309/)
  * [孟鸿：对话携程漏洞曝光白帽黑客](http://blog.jobbole.com/63840/)
  * [虚假来电：HTML5振动API的恶意使用](http://blog.jobbole.com/55499/)

[分析了443个免费代理 其中只有21％没有黑幕 那么剩下的79%呢](http://blog.jobbole.com/87822/)，首发于[博客 – 伯乐在线](http://blog.jobbole.com)。
