1. 程式人生 > >分享最近對網站外鏈跳轉頁面程式碼的一些改善

分享最近對網站外鏈跳轉頁面程式碼的一些改善

很久之前在部落格分享了幾篇關於外鏈跳轉的程式碼或教程。如果沒看過的可以先了解下:

最近,有了一些靈感以及在其他部落格也吸收了一些相關經驗,就把現用的外鏈程式碼小改了下,感覺還不錯,現在分享下,喜歡的可以試試。

Ps:不喜歡囉嗦的朋友請直接從第五步開始看。

一、安全加固

首先,加入了在魚叔部落格看到了的防止惡意請求的簡單防護程式碼:

PHP
123456789 //防止 WordPress 遭受惡意 URL 請求。From:http://blog.wpjam.com/m/block-bad-queries/if(strlen($_SERVER['REQUEST_URI'])>384||strpos($_SERVER['REQUEST_URI'],"eval(")||strpos($_SERVER['REQUEST_URI'],"base64")){@header("HTTP/1.1 414 Request-URI Too Long");@header("Status: 414 Request-URI Too Long"
);@header("Connection: Close");@exit;}

二、跳轉方式

之前的程式碼使用的是 html 的 refresh 跳轉方式:

XHTML
1 <meta http-equiv="refresh"content="1;url=https://zhangge.net/"
>

正好之前分享百度是如何取消關鍵詞的時候,curl 到的是這樣的一個結果:

XHTML
12345678910 <html><head><meta content="always"name="referrer" />  <script>try{if(window.opener&&window.opener.bds&&window.opener.bds.pdc&&window.opener.bds.pdc.sendLinkLog){window.opener.bds.pdc.sendLinkLog();}}catch(e){};vartimeout=0;if(/bdlksmp/.test(window.location.href)){varreg=/bdlksmp=([^=&]+)/,matches=window.location.href.match(reg);timeout=matches[1]?matches[1]:0};setTimeout(function(){window.location.replace("http://www.baidu.com/")},timeout);</script> <noscript><meta http-equiv="refresh"content="0;URL='http://www.baidu.com/'" /></noscript></head><body></body></html>

百度使用了一個跳轉方式,成功偽造了新的 referrer 來路,從而遮蔽了搜尋關鍵詞。

很明顯上面的程式碼使用了 html 的 refresh 和 JS 兩種跳轉模式,而 html 的用到了 noscript 標籤,也就是說當瀏覽器不支援 js 的時候才會使用 html 跳轉的方式。

所以,我之前分享的跳轉程式碼也可以參考改進下:

XHTML
1234567891011121314151617 <!-- html備用跳轉 --><noscript><meta http-equiv="refresh"content="1;url='<?phpecho$url;?>';"></noscript><script>functionlink_jump(){//禁止其他網站使用我們的跳轉頁面varMyHOST=newRegExp("zhangge.net");if(!MyHOST.test(window.location.href)){location.href="http://".MyHOST;}location.href="<?php echo $url;?>";}//延時1S跳轉,可自行修改延時時間setTimeout(link_jump,1000);//延時50S關閉跳轉頁面,用於檔案下載後不會關閉跳轉頁的問題setTimeout(function(){window.opener=null;window.close();},50000);</script>

三、跳轉加密

看過有部落格對外鏈進行了一個 Base64 加密,所以我也加入了這次小改當中,而且還可以同時相容不加密的跳轉連結:

PHP
1234 //對傳入資料進行判斷,如果是加密串就進行解密:if($t_url==base64_encode(base64_decode($t_url))){$t_url=base64_decode($t_url);}

四、禁止收錄

既然是外鏈跳轉,肯定不希望被蜘蛛收錄或抓取,所以多加入了一個禁止收錄和抓取的 META 申明:

PHP
1 <meta name="robots"content="noindex, nofollow"/>

五、正式部署

①、完整跳轉程式碼

I、PHP 版本

PHP
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 <?phpif(strlen($_SERVER['REQUEST_URI'])>384||strpos($_SERVER['REQUEST_URI'],"eval(")||strpos($_SERVER['REQUEST_URI'],"base64")){@header("HTTP/1.1 414 Request-URI Too Long");@header("Status: 414 Request-URI Too Long");@header("Connection: Close");@exit;}//通過QUERY_STRING取得完整的傳入資料,然後取得url=之後的所有值,相容性更好$t_url=preg_replace('/^url=(.*)$/i','$1',$_SERVER["QUERY_STRING"]);//此處可以自定義一些特別的外鏈,不需要可以刪除以下5行if($t_url=="zhangge"){$t_url="https://zhangge.net";}elseif($t_url=="baidu"){$t_url="https://www.baidu.com/";}//資料處理if(!empty($t_url)){//判斷取值是否加密if($t_url==base64_encode(base64_decode($t_url))){$t_url=base64_decode($t_url);}//對取值進行網址校驗和判斷preg_match('/^(http|https|thunder|qqdl|ed2k|Flashget|qbrowser):\/\//i',$t_url,$matches);if($matches){$url=$t_url;$title='頁面載入中,請稍候...';}else{preg_match('/\./i',$t_url,$matche);if($matche){$url='http://'.$t_url;$title='頁面載入中,請稍候...';}else{$url='http://'.$_SERVER['HTTP_HOST'];$title='引數錯誤,正在返回首頁...';}}}else{$title='引數缺失,正在返回首頁...';$url='http://'.$_SERVER['HTTP_HOST'];}?><html><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8"><meta name="robots"content="noindex, nofollow"/><noscript><meta http-equiv="refresh"content="1;url='<?phpecho$url;?>';"></noscript><script>functionlink_jump(){//禁止其他網站使用我們的跳轉頁面varMyHOST=newRegExp("<?php echo $_SERVER['HTTP_HOST']; ?>");if(!MyHOST.test(document.referrer)){location.href="http://"+MyHOST;}location.href="<?php echo $url;?>";}//延時1S跳轉,可自行修改延時時間setTimeout(link_jump,1000);//延時50S關閉跳轉頁面,用於檔案下載後不會關閉跳轉頁的問題setTimeout(function(){window.opener=null;window.close();},50000);</script><title><?phpecho$title;?></title><style type="text/css">body{background:#555}.loading{-webkit-animation:fadein2s;-moz-animation:fadein2s;-o-animation:fadein2s;animation:fadein2s}@-moz-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-o-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes fadein{from{opacity:0}to{opacity:1}}.spinner-wrapper{position:absolute;top:0;left:0;z-index:300;height:100%;min-width:100%;min-height:100%;background:rgba(255,255,255,0.93)}.spinner-text{position:absolute;top:45%;left:50%;margin-left:-100px;margin-top:2px