李曉飛
(陜西鐵路工程職業技術學院 陜西 渭南714000)
隨著計算機網絡技術發展,Web數據庫技術已成為在應用系統中應用廣泛的網站架構基礎技術[1-3],Web提供了與用戶通信聯絡的有效手段,實現Web服務器與數據庫系統的連接,完成數據的處理查詢,用戶通過操作瀏覽器能夠查詢處理所需要的各種數據[4]。而網站項目的設計和開發進入了需要強調流程和分工的時代,比如建立一個網站需要進行需求分析、可行性分析、建立模型、網站測試和維護等。只有建立規范的、有效的、健壯的開發機制,才能適應用戶不斷變化的需要,進而達到預期的計劃目標。這里主要針對網站需要實現的功能,對其進行建模。前臺信息的動態更新是通過后臺獲取相應的欄目信息而展示的,為了防止非法入侵者進入后臺篡改前臺顯示信息,需要對用戶登錄后臺所使用的用戶名和密碼進行加密。
MD5是Web應用程序中最常用的密碼加密算法[5-6]。由于MD5是不可逆的,因而經過MD5計算得到的密文不能通過逆向算法得到原文。Web應用程序中使用MD5加密文本密碼就是為了防止直接獲得數據庫所保存的密碼。攻擊者不僅擁有數據量巨大的密碼字典,而且建立了很多MD5原文/密文對照數據庫,能快速地找到常用密碼的MD5密文。然而,MD5密文數據庫所使用的是最常規的MD5加密算法:原文→MD5→密文。因此,可以使用變換的MD5算法,使現成的MD5密文數據庫無所作為。其常用的變換算法有:循環MD5、密文分割MD5、附加字符串干涉、大小寫變換干涉、字符串次序干涉。由于網站后臺使用循環MD5算法,故這里對其詳細論述。
最容易理解的變換是對一個密碼進行多次的MD5運算。自定義一個函數,它接受$data和$times 2個形參,前者是加密的密碼,后者是重復加密的次數。實現這種變換有兩種算法,分別為迭代算法和遞歸算法。
1.1.1 迭代算法


1.1.2 遞歸算法

加密后的用戶名和密碼的存儲表如圖1所示。可以看到存儲表中并不是直接存儲用戶的用戶名和密碼,而是32位的亂碼字符,這樣即使他人非法進入數據庫也無法直接得到正確的用戶名和密碼,從而提高了網站的安全性,為用戶的信息安全提供了基本保障。

圖1 用戶名和密碼存儲表Fig.1 User names and passwords storage table
盡管用戶的密碼是不確定的字符串,但是只要經過一次MD5運算后就會得到一個由32個字符組成的字符串,這時再對這個定長字符串進行變換。把這段密文分割成若干段,每段都進行MD5運算,然后把這堆密文連成一個超長的字符串,最后再進行一次MD5運算,得到仍然是長度為32位的密文。
在加密過程中,附加內容確定的字符串(比如用戶名)。干涉被加密的數據,不可以用隨機字串,因為這樣會使原算法無法重現。這種算法可用于大量的用戶密碼加密,把用戶名作為附加干涉字串,攻擊者即使知道具體應用算法,也很難生成海量的對照表,大量破譯用戶密碼也只能有針對性的為數不多的用戶。
MD5變換算法是數之不盡的[6],甚至無須自己再創造,就用上述5種算法互相組合就可以設計上很多算法,比如說先循環加密后再分割,并在每一段上附加一個字符串再分別加密,然后變換字符大小寫并顛倒字符串順序后連成一個長字符串再進行MD5運算…… 這樣就能大大地增加破譯出密碼原文的難度。
如果某些漏洞,比如SQL Injection或者文件系統中的數據庫被下載,異致用戶密碼數據泄露,MD5變換算法就能大大地增加破譯出密碼原文的難度[7]。使網上很多的MD5原文/密文對照數據庫無效攻擊者用常規算法去窮舉一串由變換算法得到的密文無法辨別。當然,MD5變換算法特別適合用于非開源的Web程序,雖說用在開源的程序中優勢會被削弱,但是也能抑制MD5原文/密文對照數據庫的作用。
然而僅僅只對用戶登錄所使用的用戶名和密碼進行加密是遠遠不夠的,因為非法入侵者可能直接進入后臺操作,這時同樣無法保障用戶的安全,以下針對直接進入后臺操作進行研究。
session是用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉所經過的這段時間,也就是用戶瀏覽這個網站所花費的時間。
session中注冊的變量可以作為全局變量使用,這樣就可以將session用于用戶身份認證、程序狀態記錄、頁面之間參數傳遞。實現 session需要調用 3個函數:session_start()、session_register()、session_is_registered()。 首先每個網頁最開始處要調用session_start(),這樣是為了啟動系統的session機制;然后再登錄驗證界面定義一個變量如$username,然后為該變量注冊 session_register('usernamepwd'),并為其賦值。在另一個界面上判斷是否對該變量進行了注冊,從而防止他人直接跨過登錄界面進入后臺操作。
1)登錄界面驗證

2)其他頁面

在編寫一個進銷存系統中發現需要讓多個用戶可以同時進入一個php應用程序,原來所設計靜態的唯一的session ID導致數據混亂。因此必須動態生成一個唯一的session ID。采用php文件名+時間戳來生成唯一的session ID,這樣每個session就不再混亂。其源代碼如下:

用mysessionname為頁面間唯一的sessionname傳遞變量,Mysessionname不能為session的內部變量名,因為在session開始之前就已經存在了,Mysessionname也不能用cookie方式存放,這是因為多個session肯定會覆蓋掉原先的cookie文件,因此可以用隱含表單的域來保存。
研究構建個人網站的后臺技術,應用改良的MD5算法確保了網站前臺登錄時的安全性,引入session機制有效防止了非法入侵者直接繞過登錄界面進入后臺操作的危害,從而保障了個人網站安全性。
[1]鄒天思.PHP網絡編程標準教程[M].北京:人民郵電出版社,2009:219-221.
[2]宮垂剛.PHP實例精通[M].北京:機械工業出版社,2009:81-84,112-113,154.
[3]賀民.PHP專業項目實例開發[M].北京:中國水利水電出版社,2003:220-221.
[4]馮燕奎.PHP4.0與MySQL動態網站編程[M].北京:清華大學出版社,2006:78-139.
[5]武欣.PHP和MySQL Web開發[M].北京:機械工業出版社,2009:100-190.
[6]魏紅國.PHP+MySQL動態網站開發[M].南京:東南大學出版社,2008:120-170.
[7]劉彥博.高性能網站建設指南[M].北京:電子工業出版社,2008:56-150.