java 监控 收集资料2(收集中)
PHP偽造來源HTTP_REFERER的方法討論
可以用于 防止惡意的頂貼,限制同一時間內重復發貼
?
如今網絡上十分流行論壇自動發帖機,自動頂貼機等,給眾多論壇網站帶來了大量的垃圾信息,許多網站只是簡單地采用了判斷HTTP_REFERER的值來進行過濾機器發帖,可是網頁的HTTP_REFERER來路信息是可以被偽造的。任何事物都是雙面刃,只要你善于利用就有其存在價值。
?
????很早以前,下載軟件如Flashget,迅雷等都可以偽造來路信息了,而這些軟件的偽造HTTP_REFERER大多是基于底層的sock來構造虛假的http頭信息來達到目的。本文就純粹從技術角度討論一下,php語言下的偽造HTTP_REFERER的方法,以期讓大家了解過程,更好的防御。
?
????環境:Apache/2.2.8?+?PHP/5.2.5?+?Windows?XP系統,本地測試。
?
????首先,在網站虛擬根目錄下建立1.php和2.php兩個文件。
?
????其中,1.php文件內容如下:
?
<?php$host?=?'127.0.0.1';
$target?=?'/2.php';
$referer?=?'http://www.piaoyi.org';?//偽造HTTP_REFERER地址
$fp?=?fsockopen($host,?80,?$errno,?$errstr,?30);
if?(!$fp){
echo?"$errstr($errno)<br?/>\n";
}?
else{
$out?=?"
GET?$target?HTTP/1.1
Host:?$host
Referer:?$referer
Connection:?Close\r\n\r\n";
fwrite($fp,?$out);
while?(!feof($fp)){
echo?fgets($fp,?1024);
}
fclose($fp);
}
?>
?
????另一個2.php文件很簡單,只是寫上一行讀取當前的HTTP_REFERER服務器值的代碼即可,如下:
?
<?phpecho?"<hr?/>";
echo?$_SERVER["HTTP_REFERER"];
?>
?
????執行1.php文件,打開http://localhost/1.php,頁面返回信息如下:
?
HTTP/1.1?200?OK?Date:?Fri,?04?Apr?2008?16:07:54?GMT?Server:?Apache/2.2.8?(Win32)?PHP/5.2.5?X-Powered-By:?PHP/5.2.5?Content-Length:?27?Connection:?close?Content-Type:?text/html;?charset=gb2312?
--------------------------------------------------------------------------------
http://www.piaoyi.org
?
????看到了結果了吧,偽造來源HTTP_REFERER信息成功。所以,如果你的網站僅僅是判斷HTTP_REFERER,并不是安全的,別人一樣可以構造這樣的來源,簡單的防御方法就是驗證頁里加上驗證碼;還可以結合IP判斷的方法。
?
????補充:ASP下的偽造來源的代碼如下:
?
<%dim?http?set?http=server.createobject("MSXML2.XMLHTTP")?'//MSXML2.serverXMLHTTP也可以
Http.open?"GET",url,false?
Http.setRequestHeader?"Referer","http://www.piaoyi.org/"?
Http.send()?%>
?
????如果你是一個有心人,請不要惡意利用這些方法,畢竟壞事做多了的話,效果就過猶不及了;比如你發大量的垃圾帖子吧,可能短期內會給你帶來大量的外部鏈接,但這樣的黑帽手段遲早要被搜索引擎發現,而這些已經發出去的鏈接就好像潑出去的水一樣收不回來,這樣的罪證就不是你能控制的了。?
?
?
Javascript截取URL中的域名
通過正則獲取,兼容ftp://username:password@格式
var getHostName=function(url) {//scheme : // [username [: password] @] hostame [: port] [/ [path] [? query] [# fragment]]*/var e = new RegExp('^(?:(?:https?|ftp):)/*(?:[^@]+@)?([^:/#]+)'),matches = e.exec(url);return matches ? matches[1] : url; };JSP獲取header信息request列表?
<%?
out.println("Protocol: " + request.getProtocol() + "<br>");?
out.println("Scheme: " + request.getScheme() + "<br>");?
out.println("Server Name: " + request.getServerName() + "<br>" );?
out.println("Server Port: " + request.getServERPort() + "<br>");?
out.println("Protocol: " + request.getProtocol() + "<br>");?
out.println("Server Info: " + getServletConfig().getServletContext().getServerInfo() + "<br>");?
out.println("Remote Addr: " + request.getRemoteAddr() + "<br>");?
out.println("Remote Host: " + request.getRemoteHost() + "<br>");?
out.println("Character Encoding: " + request.getCharacterEncoding() + "<br>");?
out.println("Content Length: " + request.getContentLength() + "<br>");?
out.println("Content Type: "+ request.getContentType() + "<br>");?
out.println("Auth Type: " + request.getAuthType() + "<br>");?
out.println("HTTP Method: " + request.getMethod() + "<br>");?
out.println("Path Info: " + request.getPathInfo() + "<br>");?
out.println("Path Trans: " + request.getPathTranslated() + "<br>");?
out.println("Query String: " + request.getQueryString() + "<br>");?
out.println("Remote User: " + request.getRemoteUser() + "<br>");?
out.println("Session Id: " + request.getRequestedSessionId() + "<br>");?
out.println("Request URI: " + request.getRequestURI() + "<br>");?
out.println("Servlet Path: " + request.getServletPath() + "<br>");?
out.println("Accept: " + request.getHeader("Accept") + "<br>");?
out.println("Host: " + request.getHeader("Host") + "<br>");?
out.println("Referer : " + request.getHeader("Referer") + "<br>");?
out.println("Accept-Language : " + request.getHeader("Accept-Language") + "<br>");?
out.println("Accept-Encoding : " + request.getHeader("Accept-Encoding") + "<br>");?
out.println("User-Agent : " + request.getHeader("User-Agent") + "<br>");?
out.println("Connection : " + request.getHeader("Connection") + "<br>");?
out.println("Cookie : " + request.getHeader("Cookie") + "<br>");?
out.println("Created : " + session.getCreationTime() + "<br>");?
out.println("LastAccessed : " + session.getLastAccessedTime() + "<br>");?
%>?
運行結果:?
Protocol: HTTP/1.1?
Scheme: http?
Server Name: 192.168.0.1?
Server Port: 8080?
Protocol: HTTP/1.1?
Server Info: JavaServer Web Dev Kit/1.0 EA (JSP 1.0; Servlet 2.1; Java 1.2; Windows NT 5.0 x86; java.vendor=Sun Microsystems Inc.)?
Remote Addr: 192.168.0.106?
Remote Host: abc?
Character Encoding: null?
Content Length: -1?
Content Type: null?
Auth Type: null?
HTTP Method: GET?
Path Info: null?
Path Trans: null?
Query String: null?
Remote User: null?
Session Id: To1010mC466113890241879At?
Request URI: /c.jsp?
Servlet Path: /c.jsp?
Accept: */*?
Host: 192.168.0.1:8080?
Referer : null?
Accept-Language : zh-cn?
Accept-Encoding : gzip, deflate?
User-Agent : Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)?
Connection : Keep-Alive?
Cookie : SESSIONID=To1010mC466113890241879At?
Created : 965764522168?
LastAccessed : 965775587088?
在網站的統計數據中有對網站流量來路的統計,這些數據到底是怎么來的呢?這就要從瀏覽器如何訪問一個網址說起了,簡單點來說,當我們通過輸入網址或者其他途徑(點擊網頁中鏈接、地址收藏欄等)訪問某個網址的時候,瀏覽器會向網頁所在的web服務器發送http請求,web服務器在接受到請求后做相應的處理,并返回處理結果給客戶端瀏覽器,如果一切正常的話,客戶端(瀏覽器)就可以看到最終的網頁效果了。
在客戶端(瀏覽器)向web服務器發送請求(HTTP Request)的過程中會發送一些信息,這些信息叫做HTTP Header,web服務器會對HTTP Request做出回應,回應的消息叫做Response Header。流量統計中的網站來路和HTTP Header有關,在HTTP Header中可以包含HTTP Referer,在向服務器請求網頁數據的時候服務器通過Referer就知道當前是從哪個網頁過來的了,用PHP和ASP我們也可以很容易的獲取到Referer信息。
接下來我們通過wireshark抓取下數據包來驗證一下,下面是直接在瀏覽器中輸入知蟻博客的url地址進行訪問的時候發送給web服務器的HTTP Header,這里沒有Referer信息,因此也就無法進行來路的判斷。
GET / HTTP/1.1
Host: www.letuknowit.com
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: AJSTAT_ok_times=19;
這個是在盧松松的留言板中打開知蟻博客的時候發送給web服務器的HTTP Header,下面的紅色部分就是Referer了,根據這個信息流量統計代碼就能夠知道這個流量是來自于盧松松的留言板,也就可以進行來路的評定了。
GET / HTTP/1.1
Host: www.letuknowit.com
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://www.lusongsong.com/guestbook/
Cookie:AJSTAT_ok_times=19;
來路統計并不一定準確,完全可以通過程序進行來路的偽造,不知道大家有沒有被別人刷站的經歷,知蟻博客在剛剛建立不久就經歷過一次,當時查看訪問數據的時候小高興了一把,訪問量飆升啊,但是仔細看看來路后我郁悶了,全部是來自于sogou的關于【xx寶】關鍵字的,相當的惡心啊!
這是一個很典型的偽造來路的例子,打開來路地址,其中根本就沒我們的網站鏈接。遇到這種情況,封IP基本上是搞不定的,因為每個流量的來路雖然一樣,但是IP地址都不一樣,其實知道了原理之后這個問題也好解決,對所有來路進行檢測,當檢測到特定來路的時候直接返回或者跳轉到其他地址。
不過,這樣做只能是讓其無法打開我們的網頁而已,實際其和web服務器的交互已經全部完成,并且從web服務器返回了網頁html代碼,我們只是在網頁顯示之前進行處理,其實就是相當于在網頁開頭寫上一句重定向的代碼,這樣統計數據中就不會有這些來路了。最好的辦法還是在web服務器端進行配置來限制特定的來路。
使用jpcap開源java包。(http://netresearch.ics.uci.edu/kfujii/Jpcap/doc/index.html)?
調用jni :wincap/libcap。(先配置jni)?
采用arp欺騙技術(使用jpcap包可以發送arp reply pack,線程定時發送)。使本機作為路由數據包的中轉站。?
原來傳輸:路由-->host a?
欺騙后:路由-->local host 再轉發(轉發時可以設置一定的延時使目標host網速較慢,如果有這個必要)-->host a;?
同樣host a發送請求時先到本機再到路由。?
定時計算同一host地址(截獲的數據包中有)的數據包合計大小。折合成kb流量,時時顯示(單獨線程)?
同時可以顯示host req或resp的ip(dns反向解析地址可以顯示host當前訪問的網站);?
停止監聽:發送正確的arp reply pack給每一個host。?
結束arp 欺騙reply包的發送。
http://www.iteye.com/problems/63753
java jpcap收發UDP數據包實例? ?
jpcap簡介及ARP實例【Z】? ?
總結
以上是生活随笔為你收集整理的java 监控 收集资料2(收集中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡的钱还不上怎么办 可以使用最低还款
- 下一篇: 吴奇隆前妻(说一说吴奇隆前妻的简介)