beijixing 发表于 2013-5-22 18:49:44

网站小偷程序吊丝版(原理、实现,及几种玩法)

大洲的小偷程序非常让人眼馋,无奈本diao丝程序员,一无RMB,二无论坛币,只能望洋兴叹,所幸我有web程序开发的经验,对于这个小偷程序的基本原理能猜到不少,本着自力更生,服务大众的精神,我自己实现了一个简易版,在此开源给大家,希望能赚点论坛币,早日进入email版见见世面。

一、原理
1.用户访问流程:
(1)用户访问我们的冒牌站(A.com)
(2)网站后台程序根据用户的query参数(包括get/post/cookie)构造原始网站B.com的url,用后台程序去访问该url,此时可以拿到原始网站的html和header输出。这里有一点需要注意的是原始网站输出的头也不可以忽略,里面的set-cookie信息也可以转发给用户的,这样就可以实现注册和登陆原网站啦。
(3)对原始网站的html输出和header输出按某些规则做替换,比如把某些广告去掉啦,把B.com的地址替换成A.com啦,其实这一步是最关键的,也是玩法最多最好玩的部分
(4)将替换后的html和header输出给用户。

2.规则替换的几种玩法:
(1)最简单的当然是字符串和正则表达式了,这就不多说了
(2)用html解析库对html的dom节点做操作,然后重新生成html,比如可以把页面中的text node翻译成另一种语言,或者做文章重写,这样比较容易逃过搜索引擎的法眼。
据我所知每种语言都由若干个html库,比如php的有DOM、phpQuery等,java的有htmlcleaner等
(3)在原始html代码的后面加入一些javascript代码,用来隐藏一些页面元素,或加入一些广告代码等

3.关于速度和性能:
(1)提到性能第一个想到的当然是缓存啦,我觉得最适合加缓存的地方就是上文1.1.2中提到的生成原始网站url后,这里可以对原始url做md5编码,访问一次改url后就把它的内容和头存到硬盘上,这样就不用每次都去原网站拉取了。做缓存的另一个好处是不用担心被原网站屏蔽。

(2)对于css,图片,js等静态文件,其实不用每个文件都让php访问原网站拉取,可以直接返回个302,让浏览器直接去原网站拉取。


二、实现
1.程序语言:
其实这个东西哪种语言都能搞定,也都不麻烦,我对php比较熟,就选了php。
2.一些准备工作:
(1)修改apache的rewrite规则,因为我们的程序只有一个文件,我们必须把所有接收到的请求都重定向到这个文件,这里我假设重定向到index.php,在apache的<VirtualHost>中加入这几句,如果是虚拟主机的话就修改.htaccess吧,不过我没试过,所以不知道怎么写re它的write规则
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{SCRIPT_FILENAME} -s
RewriteCond %{DOCUMENT_ROOT}%{SCRIPT_FILENAME} -l
RewriteCond %{DOCUMENT_ROOT}%{SCRIPT_FILENAME} -d
RewriteRule ^.*$ -
RewriteRule ^.*$ /index.php

(2)安装php的http模块
php发http请求的函数库找了好几个,发现http模块是用起来最简单的,不过需要你会linux操作哦,安装方法在这里http://php.net/manual/en/http.install.php
ps:如果安装不上或没有vps,请把下面程序的http模块的函数换成phpcurl等http lib

3.index.php的代码:


$host = $_SERVER['HTTP_HOST'];
//这里把假站的域名替换成原始网站的,用于生成原始url
$host = str_ireplace('fake.com', "true.com", $host);
$toUrl = sprintf("http://%s%s", $host,$_SERVER['REQUEST_URI']);

$script_name = $_SERVER['SCRIPT_NAME'];
$arr = explode(".", $script_name);
$endName = $arr;


//这些后缀结尾的url直接返回302
$STATIC_END_NAME = array('css','xml','rss','gif','jpg','jpeg','js','axd','atom',
                'mml','txt','jad','htc',
                'png','tif','tiff','wbmp','ico','jng','bmp','svg',
                'jar','war','ear','hqx','doc','pdf','ps','eps','ai',
                'rtf', 'xls', 'ppt', 'wmlc', 'xhtml', 'cco', 'jardiff',
                'jnlp', 'run', 'pl', 'pm', 'prc', 'pdb', 'rar', 'rpm',
                'sea', 'swf', 'sit', 'tcl', 'tk', 'der', 'der', 'crt',
                'xpi', 'zip', 'bin', 'exe', 'dll' ,'deb', 'dmg', 'eot',
                'iso', 'img', 'msi', 'msp', 'msm' ,'mid', 'midi', 'kar',
                'mp3', 'ra', '3gpp', '3gp', 'mpeg', 'mpg', 'mov', 'flv',
                'mng', 'asx', 'asf', 'wmv', 'avi');

if(in_array($endName ,$STATIC_END_NAME))
{
      $headerStr = sprintf("Location: %s", $toUrl);
      header( $headerStr, true, 302);
      exit;
}

//一个简单的cache
function GetFromCache( $url)
{
    $current_dir = dirname(__FILE__);
    $cache_dir = $current_dir . "/cache/";
    if( !is_dir( $cache_dir))
    {

      mkdir($cache_dir);
    }

    $cache_file = $cache_dir . md5($url);
    if(file_exists( $cache_file))
    {
      $html = file_get_contents( $cache_file);
      if($html == false)
      {
            $html = "";
      }
    }else
    {
        //访问原始网站
      $data = http_get($url ,array('redirect' => 5, 'timeout' => 10), $http_info );
      $message = http_parse_message($data);

      $html = trim($message->body);

      file_put_contents( $cache_file, $html);
    }

    return $html;
}

$html = GetFromCache( $toUrl );


$html = str_replace("circleid.com", "circleid.us", $html);

$html = preg_replace('/<meta name=.*>/', "", $html);


//注释的这两句是用phpquery操作
//$body = htmlqp($body)->find('#header')->remove()->html();
//$html = htmlqp($html)->find('#header')->remove()->document->saveHTML();

$script = <<<EOD
<script>
$(document).ready(function() {
                $("#footer").remove();

});

</script>

EOD;

echo($html . $script);


三、最后
1.总之,这个程序还很简陋,没有处理post和cookie参数,也没有配置管理模块,距离大洲的程序差距有一个大洲那么大,仅适合稍微懂点程序又有点好奇心的新手玩玩
2.最后当然是希望大家不令赐分啦,您的论坛币是我继续分享的动力,哈哈

chinafla 发表于 2013-5-22 19:15:10

随便找一个proxy代码 功能以去掉 什么都齐全了。。。

joul 发表于 2013-5-22 19:33:55

有一个技术流牛人!赞一个!!!

terranboy 发表于 2013-5-22 19:49:04

NGINX 天生的小偷 结合LUA 各种替换

goog1e 发表于 2013-5-22 19:49:15

nginx 早已经实现了,有插件.:D

tyro 发表于 2013-5-22 20:20:28

期待楼主的程序,大洲 的程序貌似挺牛,但是贵,初级屌丝用着吃力。

beijixing 发表于 2013-5-22 21:21:05

chinafla 发表于 2013-5-22 19:15 static/image/common/back.gif
随便找一个proxy代码 功能以去掉 什么都齐全了。。。

是的,其实就是个web proxy,重要的是替换模块的创意和玩法。
我觉得大洲最NB的一点就是把配置管理和站群管理做的很方便,另外就是把替换功能做成插件化,这些边边角角的活看起来没啥技术含量,但是做过产品的人都知道很劳心劳力的

毕加 发表于 2013-5-22 21:34:12

楼主牛人。。。

ROTOU 发表于 2013-5-23 00:46:21

对于css,图片,js等静态文件,其实不用每个文件都让php访问原网站拉取,可以直接返回个302,让浏览器直接去原网站拉取。

源网站如果有防盗链的,就不行了。
危害性

302重定向很容易被搜索引擎误认为是利用多个域名指向同一网站,那么你的网站就会被封掉,罪名是“利用重复的内容来干扰Google搜索结果的网站排名”。因为302重定向经常别用于做url劫持,黑帽seo技术中,而且百度在处理302重定向技术还不成熟,经常将它纳入到黑帽seo的范畴中,而google对这方面识别处理就完善了许多。所以302重定向在现阶段的搜索引擎技术中,还是容易导致网站降权的,尽量不用。但从seo、网站优化方面来说是弊大于利。

hudba 发表于 2013-5-23 06:42:39

没看懂,楼主你抓取的html是永久保存在服务器硬盘吗?还是用户访问每次都抓或者缓存?
抓来的页面模板要重新设计吗?觉得最后还是要能赚钱。伪原创?

生鱼片 发表于 2013-5-23 09:11:53

一个NGINX就搞定了 效率还高
简单的替换有相应模块

Jack 发表于 2013-5-23 09:28:35

会程序的就是NB哈

beijixing 发表于 2013-5-23 09:38:36

hudba 发表于 2013-5-23 06:42 static/image/common/back.gif
没看懂,楼主你抓取的html是永久保存在服务器硬盘吗?还是用户访问每次都抓或者缓存?
抓来的页面模板要重 ...

这个代码里的cache主要是做demo,是存在硬盘里的,实际使用中你完全可以用memcache或数据库代替,cache的过期策略也可以自己控制

eyemans 发表于 2013-5-23 11:22:12

也是一个高手哦。。。

如松 发表于 2013-5-27 10:32:21

技术流牛人!赞一个!!!
页: [1] 2
查看完整版本: 网站小偷程序吊丝版(原理、实现,及几种玩法)