2009年11月4日星期三

在线代理网址加密方式自定义修改

  来源: 胡桃夹子的驿站 
前 一段时间刚搞好了在线代理网站,结果正好赶上墙升级,所有基于base64来加密网址的代理程序全完,倍受打击,就把这一块扔下了,近期收集并分析考虑了 部分背景资料,觉得墙也不至于太过分,在线代理这一块长远来讲死掉的可能性并不大,于是今天心血来潮想再研究下在线代理相关的东西。

首先分析一下为什么在这个问题上墙不会太狠。首先申明这个判断是基于目前的情况,对于伟大的天朝,明天会怎么样是谁也无法预测的,always ***er than you think(***为某些形容词,可以自己填空,哈)。
1、在线代理目前仍是一个小众的东西,规模并没有大到引起高层敏感的程度,毕竟我国网民的平均文化水平和人权意识还相当低。
2、封锁技术还没有足够成熟,某些技术细节上还存在困难,导致封锁成本太高,即使偏执的天朝也不是那么情愿承担。
3、实现对base64加密的过滤并不是针对在线代理依靠的网址加密,而是针对容量巨大的内容加密,即为了过滤关键词。
其实在线代理之所以要把网址用base64加密,是出于字符兼容性的考虑,能实现穿越只是个副作用,并不是设计初衷,毕竟如此厉害的墙是咱们特有的,在国际上还是非主流。以前能实现穿越只是因为墙当时还不够完善,现在考虑到了而已,属于正常范畴。
对 于自己搭建在线代理平台(不是说聚合即盗链的方式,而是在自己的服务器上搭建,消耗自己的资源),变更网址加密的方式有无数种,我最近看到的就有 字母乱序、替换.为*、加减元素等等五花八门的方法,例如下面这种自定义函数实现随机数加密,确实很有意思,由于加密条件是个性化的,加密结果还可以随机 变化,这样基本上无论墙怎么设置过滤条件都无法实现封锁:
function encoded($ses)
 {
        $sesencoded = $ses;
         $num = mt_rand(3,9);
         for($i = 1 ; $i <= $num ; $i++)
         {
                $sesencoded = base64_encode($sesencoded);
         }
        $alpha_array = array('Y','D','U','R','P','S','B','M','A','T','H');
         $sesencoded = $sesencoded . "+" . $alpha_array[$num];
         $sesencoded = base64_encode($sesencoded);
         return $sesencoded;
}//end of encoded function
  
function decoded($str)
 {
        $alpha_array = array('Y','D','U','R','P','S','B','M','A','T','H');
         $decoded = base64_decode($str);
         list($decoded,$letter) = split("\+",$decoded);
         for($i = 0 ; $i<count($alpha_array) ; $i++)
         {
                if($alpha_array[$i] == $letter)
                         break;
        }
        for($j=1;$j<=$i;$j++)
         {
                $decoded =  base64_decode($decoded);
         }
        return $decoded;
 }//end of decoded function
上面说的加密方式都挺有效,但稍显繁琐,尤其当程序代码中要修改的地方很多时更是如此,其实由于函数可以嵌套,最简单的思路是用base64重复加码就可以了,即:
base64_encode(base64_encode($url));
 base64_decode(base64_decode($url));
简 单吧,这样就没法实现过滤了,那么墙有没有可能考虑到这一点,在过滤时加以检测?当然有可能,但可能性不大,因为作为数据量如此庞大的过滤检测, 如果增加一重函数检验,会增加巨大的硬件成本,还会进一步拖慢网络速度。即使墙真这么变态检测二次加码也没关系,咱再重复加码1次、3次、10次……不就 行了嘛,看这个负载墙受不受得了,哈哈。退一万步讲,要真这么变态了,用上面的自定义加密函数的方法就行了,绝无完全封锁的可能。

没有评论:

发表评论