About Me

我的相片
台北市, Taiwan
我是方選,
方白科技(finebind tech.)共同創辦人,
臺大資管所畢,
希望能幫助更多的人!

FB: http://fb.com/function1122
LINE: http://bit.ly/1foeZft (手機開啟點擊網址自動加入)

最新15則讀者回應

最新文章

FUNction's 上課筆記

Label Cloud

Blog Archive

FeedBurner

追蹤者

某公司網站的駭客事件 (三)

FUNction 於 2008年1月27日 晚上10:17 發表
上篇:某公司網站的駭客事件(二)
然冒出了第三篇...不知道會不會有第四篇阿(希望不要)

快人快語,我是來貼程式的,因為後來某公司跟我說...以我程試跑出來的報表判斷起來很辛苦,他們希望統計出每個IP 有幾次來訪記錄(從來訪記錄多的去抓出可疑IP)。我想...也是ok 啦,從之前的程式改一改,到昨天晚上12 點剛好改完。

程式如下...

<?php
$findStr = $_GET['q'];

$fileFolder = "C:/Windows/system32/LogFiles/";
$handle = opendir($fileFolder);
$listIp; //這是將來用來存放資料的資料結構陣列
echo "<h1>Query String: ".$findStr."</h1>\n";
while ($filename = readdir($handle)) {
$fullfilename = $fileFolder.$filename;
if(is_file($fullfilename)){
$fd = fopen ($fullfilename, "r");
$contents = fread($fd, filesize($fullfilename));
fclose($fd);
$find = strstr($contents, $findStr);

//稍微改良一下,只要找到(不用計算出現幾次),就進行查詢
if($find){
getIISLogIp($contents, $findStr);
}
}
}
closedir($handle);
getIPResult(); //顯示結果

# 一樣一次讀取一天的,但是讀取之後都放到資料結構裡
function getIISLogIp($contents, $findStr){
global $listIp; //取得全域變數(資料結構)
$lineArr = explode("\r\n", $contents);
$iptmp;
$output;
foreach($lineArr as $line){
$tmp = explode(" ", $line);
$time = $tmp[1];
$day = $tmp[0];
if($tmp[8] != null){
$ip = $tmp[8];
$sub = strstr($tmp[5], $findStr);
if($sub){//如果有找到
if($listIp[$ip] == null){

//這裡一樣是優化,先看看有沒有曾經查過該IP
//建立新資料(放入資料結構)
$listIp[$ip]['isp'] = getISPInfo($ip); //查詢IP反解

$listIp[$ip]['ip'] = $ip;

//將IP存入(這裡寫不好,但好像foreach 不能在這麼複雜的情況下
//讀取陣列的key)
$listIp[$ip]['count'] = 1;
$listIp[$ip]['data'][$day] = "<b>".$day.":</b> ".$time;
}else{ //有找到則附加到現有的資料結構
$listIp[$ip]['count']++;
if($listIp[$ip]['data'][$day] == null) $listIp[$ip]['data'][$day] = "<b>".$day.":</b> ".$time;
else $listIp[$ip]['data'][$day] .= ", ".$time;
}
}
}
}
}

# 輸出資料,依照出現次數排序,列出每個IP 出現的時間
function getIPResult(){
global $listIp;
if(sizeof($listIp) > 0){
uasort($listIp, "orderIPCount");

//使用自定排序(自定函式名為orderIPCount)

foreach($listIp as $ipstream){
$ip = $ipstream['ip']; //從資料結構中取出IP
$isp = $ipstream['isp']; //取出ISP資訊(反查)
$count = $ipstream['count']; //取出出現次數
$dataArr = $ipstream['data']; //取出時間資訊
$data = "<ul>";
foreach($dataArr as $oneday){
$data .= "<li>".$oneday."</li>\n";
}
$data .= "</ul><br />\n";
echo "<span style=\"font-size: 18px; font-weight: bold;\">".$isp."</span> (IP: ".$ip.")<br />\n".$count." time(s):\n".$data;
}
}
}

# 查詢ISP資訊(反查)
function getISPInfo($ip){
$host = gethostbyaddr($ip); //執行IP反查
if(strstr($host, "HINET-IP.hinet")){

//分析字串,如果反查結果有HINET-IP.hinet 則為中華固I
//其他依此類推...
$host = "中華電信固定IP";
}elseif(strstr($host, "dynamic.hinet")){
$host = "中華電信浮動IP";
}elseif(strstr($host, "seed")){
$host = "SeedNet";
}elseif(strstr($host, "giga")){
$host = "GiGa 超網路";
}elseif(strstr($host, "tfn")){
$host = "台灣固網";
}elseif(strstr($host, "so-net")){
$host = "So-Net";
}
return $host;
}

# 自定依照出現次數多寡排序的函式
function orderIPCount($count1, $count2){
$ct1 = $count1['count'];
$ct2 = $count2['count'];
return ($ct1 > $ct2)? -1 : ($ct1 == $ct2 ? 0 : 1);
}
?>


這是程式執行的結果

結果有去的事情發生了,發現造訪最多次某公司網站的IP 是奇摩機器人,最多的那個機器人在不到一年就有39次的記錄。如果還有下篇的話...我希望不要再出現程式碼了Orz,就跟大家回報一下中華電信會不會給某公司查特定時段的IP 使用者吧:-)

上篇:某公司網站的駭客事件(二) Tags: , ,

讀者回應 ( 2 意見 )

哈哈,學長高手也,我是體育小生!!哈哈!!
不知道你是否還有印象!!昨天還和芳婷(教程的)聊到你也,他一直說你很神,然後我就一直說你真的很強,哈哈!!學長你的公司是什麼類型的啊??網頁開發??網路公司??

說到這我忽然想到學長你不是比較偏microsoft陣營的嗎,為什麼沒有用asp來解決,不過我記得之前有天在重訓室你說你不太熟asp??
我真的覺得自已已經跳到java陣營來了,連之前學的php和c++也想棄守了,往asp+servlet的路上前進中(往j2ee走)!!

想聽聽學長你的意見??

To PeMan:
1. 某公司不是我上班的公司,我現在在Microsoft 上班,工作內容比較偏向於RD
2. 我沒多久前才開始寫asp.net ,這方面我真的也蠻弱的,我是覺得,在解決問題的時候,除非有很多時間,不然用自己上手的語言最有效率。其實我也有想過用C#寫,然後還匯出個PDF 報表之類的,但其實沒有意義阿,我只是為了節省自己找的時間,並列出想要的資訊,所以我含淚選擇我最拿手的語言(PHP)啦。
3. 至於往j2ee 走,我真的沒什麼意見,我覺得現在程式語言似乎已經達到某種瓶頸了,我覺得只要跟一個"有前景"的語言就很足夠了,畢竟未來還會有很多東西要學的,說不定兩年後又會冒出什麼有壓倒性競爭力的技術,這誰都不敢把話說死。

PS. 其實我跟坊庭還蠻熟的(算吧),所以你不用加註解,我知道他是誰:P

張貼留言

如果沒有帳戶,建議使用「名稱/網址」留言喔^^