我的部落格被駭客了 – wordpress 後台登入修補
前幾天公布了 WP 後台登入的安全性問題 ( 甘道夫,我的 WordPress 被攻破了 [ WP 駭客記 ] )後,甘道夫一直都沒有出現來拯救城堡,不過等了半天,來了個清道夫,今天我們來動手修改 WP ,讓他的登入系統更安全吧。
圖 : CORA - 設定超過錯誤三次就禁止在登入
WP 的後台登入,如果被人家猜中了帳號,並且用簡單的密碼,那不就一下子就被人搞出來了,可是如果密碼強度太強又會造成自己記憶上的困難,還記得以前在園區某公司擔任小小 MIS ,MIS 頭頭交代,下個月起公司的登入密碼一率更改為複雜密碼性原則 ( 大小寫英文 + 數字符號 ),當然老闆有交代,誰敢不從呢,下個月馬上更改了複雜密碼性原則,並且強制要求員工更換,更妙的來了,雖然一定很強的密碼才可以登入,員工們乾脆用一張便利貼,寫上自己的密碼,就這樣貼在螢幕上,當然好一點的還會把它藏進自己的主機裡。( 這不是笑話 )
或許高度複雜密碼是很好安全,但是,卻不是很好用,但是我們在使用提款機的時候,也常常聽到說我的卡被吃了,因為忘記密碼超過三次,因此,我們是不是也應該幫 WP 也加上這個功能呢 ?
首先稍微解釋一下,首先我將來源頁面不是網站本身的使用者都踢除,第二點就是如果登入錯誤就記錄登入者的 IP 地址,如果超過三次錯誤,就無法再進入,當然也不會再解開,♣梅問題‧教學網【Minwt】♣ 問到我為什麼不寫個驗證碼登入阿,或是說寫一個 20 分鐘後會再解開的,不過我個人認為,部落格是個人使用,後台登入大概也只有一兩個人會用,既然連一兩個人常常在用都會打錯密碼,我也覺得沒救了。而且既然這個 IP 都錯了三次,以高安全性考量,就不要再讓他測了吧,還等 20 分鐘幹嘛哩。
這邊提供兩種方式,第一種是給不會看 PHP 的人用的,第二種是可以自己動手加程式碼,因為這種會影響到帳號密碼的程式或許有人不相信我,還是想看看到底寫了哪些東西,該不會一上傳帳號密碼就跑到我手上了吧,因此也有對這種心機重的人,喔不,是想學習程式碼的人,自己手動加入程式碼。
方法一 : 上傳即可使用
請將這個壓縮檔下載 [ 檔案下載 ]
並且上傳到 WP 的主目錄, wp-login.php 這頁請覆蓋他
上傳後開啟瀏覽器執行 http://yourdomain/corausir-table.php
來建立資料庫結構,完成後會出現 [ 新增成功 ] 字樣。
如此便完成了,之後你必須要建立一個前台的登入頁面,因為 wp-login.php 已經禁止其他地方連結
包含你如果是輸入 wp-admin/ 資料夾的專業也都會出現錯誤如下
方法二 : 自行修改 wp-login.php
STEP 1 : 找出 default 所在位置 並且在下面插入程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 //確認來源 if(substr_count($_SERVER["HTTP_REFERER"],site_url()) > 0 ){ //確認來源頁面是屬於部落格本身 $user_ip = $_SERVER['REMOTE_ADDR']; //把使用者的 IP 查詢資料庫 取得登入錯誤次數 $db = new mysqli ( DB_HOST, DB_USER, DB_PASSWORD, DB_NAME ); $db->query ( "SET NAMES 'utf8'" ); $query = "select * from login_check where login_ip = '$user_ip'"; $result = $db->query ( $query ); if(mysqli_num_rows($result) != 0){ $row = mysqli_fetch_assoc($result); if($row["login_times"] > 2){ //錯誤三次以上,轉向錯誤頁面 wp_safe_redirect("error.php?error=2"); } } $db->close(); }else{ //從非部落格頁面送出要求,轉向錯誤頁面 wp_safe_redirect("error.php?error=1"); }STEP 2 : if ( isset($_POST['log']) ) 並且在他的 下下行 插入程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 //如果錯誤碼不是空的 就把 IP 記錄到資料庫中 if($errors->get_error_code() != ''){ $user_ip = $_SERVER['REMOTE_ADDR']; //把使用者的 IP 查詢資料庫 取得登入錯誤次數 $db = new mysqli ( DB_HOST, DB_USER, DB_PASSWORD, DB_NAME ); $db->query ( "SET NAMES 'utf8'" ); $query = "select * from login_check where login_ip = '$user_ip'"; $result = $db->query ( $query ); if(mysqli_num_rows($result) == 0){ //表示沒有登入錯誤過 - 新增錯誤 IP $query = "insert into login_check (login_ip,login_times) values ('$user_ip',1)"; $result = $db->query ( $query ); }else{ //表示已經錯誤過 1 次以上,所以把它再更新 +1 $query = "UPDATE login_check SET login_times = login_times + 1 WHERE login_ip = '$user_ip'"; $result = $db->query ( $query ); } $db->close(); }STEP 3 : 建立資料庫結構 table.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <?php require( dirname(__FILE__) . '/wp-load.php' ); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>> <head> <title><?php bloginfo('name'); ?> › <?php echo $title; ?></title> <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>" /> </head> <body> <?php //新增資料庫 TABLE $db = new mysqli ( DB_HOST, DB_USER, DB_PASSWORD, DB_NAME ); $db->query ( "SET NAMES 'utf8'" ); $query = "CREATE TABLE IF NOT EXISTS `login_check` ( `login_ip` varchar(15) character set utf8 collate utf8_unicode_ci NOT NULL, `login_times` int(11) NOT NULL, PRIMARY KEY (`login_ip`) ) "; $result = $db->query ( $query ); $db->close(); echo site_url(); ?> 新增成功 </body> </html>STEP 4 : 建立 ERROR 轉向頁面 error.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文件</title> </head> <body> <center> <br /> <br /> <a href="http://blog.corausir.org/"> <img src="http://files.corausir.org/images/error<?php echo $_GET['error']; ?>.jpg" width="600" height="310" /> </a> </center> </body> </html>
如果你覺得這個方法很累,你也可以使用外掛來達成這個目的,因為我喜歡把人踢掉後還給他看一下公司的網站,因此我就還是用我自己的這個方法囉 ^^
如果你要外掛,請參考
敗家誌 : Limit Login Attempts 1.3.1 [ 中文化檔 ]
PS : 老實說,本來這篇文章要再 PO 之前的文章 24 小時內要發佈的,但是一忙起來就沒有 PO ,結果被高登老爺 " 截 " 足先登了…,不過用了高老爺的網站作範例,再次感到 12 萬分的歉意,也一同向其他列名網站致歉。
Random Posts
Loading…
目前並無相關文章











呵呵! 用WP就是有這個好處, 有很多東西可以玩!
大家互相交流是一件好事, 你說的事我不會在意的!
感謝高前輩不計較 ^_^
不錯的教學呢
還有個把wp-admin與login.php隱藏與改名的方法
可以參考下面『時間不等於金錢』的文章
http://andy.diimii.com/2009/01/wordpress安全保護-變更wp-loginphp/
如此一來可以大大增加安全性
外人不但進不來,且還熊熊找不到”門”在哪裡
改天再來研究研究~~
最近好忙呀~
分享是進步的原動力,讚啦!
變更WP核心不是個好方法,用PLUG方式或是function.php方式調用才有結構化程式設計精神。XD
@Arno Ruan
我也覺得用外掛的精神蠻好
但是…
大家都一樣~@@
這樣子~比較危險
開放原始碼就是這樣子~@@
有個 plugin 叫做 Stealth Login, 可以參考看看.
@Jekyll
用外掛來修改也是一種不錯的作法
不過我頭都洗了~~
就先這樣子吧 ^_^
呵呵骇客无处不在
天津市三鼎包装机械有限公司主要生产颗粒包装机,粉剂包装机,酱体包装机等多功能包装机。 天津市三鼎包装机械有限公司主要产品有自动颗粒包装机、自动酱体包装机、自动袋泡茶包装机、自动液体包装机、自动粉剂包装机、自动片剂包装机、多功能包装机、链传式包装机、三边封包装机.访问地址:http://www.sdbzj.com
我是来自中国大陆,希望和你们台湾骇客认识;
可以给我发你们的联系方式或博客地址!
@孤独者黑客
我們不是黑客啦 ^_^
只是稍微玩看看而已
那怎么才能和你们取的联系到呢?
本人百度:http://hi.baidu.com/long294133340