摘要:隨著信息化技術(shù)的推動和發(fā)展,信息系統(tǒng)安全日益重要,本文從信息系統(tǒng)數(shù)據(jù)合法性、MySQLi擴展的預處理機制、混淆式的密碼算法等方面對信息系統(tǒng)數(shù)據(jù)安全性建設進行了分析及探討。
Abstract: With the advancement and development of information technology, the security of information system is becoming more and more important. This paper analyzes the data security of information system from the aspects of information system data legitimacy, MySQLi extended preprocessing mechanism and confusing cryptographic algorithm.
關(guān)鍵詞:PHP;數(shù)據(jù)安全;密碼算法
Key words: PHP;data security;cryptographic algorithm
中圖分類號:TP309.2 文獻標識碼:A 文章編號:1006-4311(2017)35-0153-02
0 引言
對于互聯(lián)網(wǎng)企業(yè),信息系統(tǒng)中承載著大量的數(shù)據(jù),尤其是在線購物、網(wǎng)絡銀行等系統(tǒng),對于安全性的要求非常嚴格。一旦出現(xiàn)安全漏洞,在嚴重情況下會導致數(shù)據(jù)泄露、篡改、竊取,造成系統(tǒng)癱瘓等問題,將會給企業(yè)帶來不可估量的損失,所以說系統(tǒng)數(shù)據(jù)安全至關(guān)重要。接下來,本文將從以下幾方面分析與探討系統(tǒng)數(shù)據(jù)的安全性建設問題。
1 預防非法表單提交并驗證數(shù)據(jù)合法性
任何軟件通過HTTP協(xié)議都可以向Web服務器提交數(shù)據(jù),可以更換表單中的控件,偽造另一個表單。假設域名為“http://www.xxx.com”的服務器中有一個edit.php文件用于接收表單信息。原表單中有一組單選按鈕,只能選擇C#或PHP。如果編造一個HTML頁面,把單選按鈕替換為文本框,內(nèi)容隨意編寫,并將表單提交給http://www.xxx.com/edit.php,而服務器無法分辨真?zhèn)伪韱巍RA防非法表單提交,比較好的方式是根據(jù)一個惟一的字符串或時間戳生成一個令牌,并將這個令牌放在會話變量和表單隱藏域中。提交表單之后,檢查兩個令牌是否匹配。如果不匹配,就知道有人偽造表單向Web服務器發(fā)送數(shù)據(jù)。簡略代碼如下。
$token = md5(uniqid(rand(), true));$_SESSION['token']=$token;
再者Web表單利用瀏覽器限制了提交的內(nèi)容,但無法限制服務器接收什么樣的內(nèi)容。因此,對于用戶輸入的內(nèi)容,一定要驗證數(shù)據(jù)的合法性。在對用戶提交內(nèi)容進行驗證時,可以利用正則表達式實現(xiàn)復雜的驗證規(guī)則。比如驗證18位身份證號。在PHP中,可以使用preg_match()函數(shù)進行正則匹配,該函數(shù)的第1個參數(shù)表示正則表達式,第2個參數(shù)表示帶匹配的字符串,返回值為匹配的次數(shù)。具體代碼如下。
$id = $_POST['id']; //接收身份證號
if(!preg_match('^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$', $id)){ echo '身份證號格式不符合要求';} //驗證身份證號是否合法
通過preg_match()函數(shù)對身份證號進行驗證,當函數(shù)返回的匹配次數(shù)為0時,表示輸入的字符串不符合規(guī)則。
2 防御SQL注入
SQL注入是開發(fā)人員未對用戶輸入的數(shù)據(jù)進行過濾就拼接到SQL語句中執(zhí)行,導致用戶輸入的一些特殊字符破壞了原有SQL語句的邏輯,造成數(shù)據(jù)被泄露、篡改、刪除等危險的后果。比如下列代碼就存在SQL注入問題。該代碼將來自外部的name數(shù)據(jù)直接拼接到SQL語句中,如果用戶輸入了單引號,則會將原有SQL語句中的單引號閉合,然后用戶就可以將自己輸入的內(nèi)容當成SQL執(zhí)行。
$name = $_POST['name'];
$result=mysqli_query($link, "SELECT * FROM `admin` WHERE `name`='$name'");
假設用戶輸入“'or 1='1”,SQL語句將變?yōu)镾ELECT * FROM `admin` WHERE `name`='' or 1='1'。此時就會通過or條件查詢出admin表中所有的記錄,造成了數(shù)據(jù)的泄露。接下來改進上述代碼,操作數(shù)據(jù)庫使用了MySQLi擴展的預處理機制,將SQL語句和數(shù)據(jù)分離,從本質(zhì)上避免了SQL注入問題的發(fā)生,同時也更加高效,簡略代碼如下。
$name = $_POST['name']; //接收變量
$stmt = mysqli_prepare($link, 'SELECT * FROM `admin` WHERE `name`=?');//創(chuàng)建 SQL 語句模板,預留的變量$name值使用參數(shù) "?" 標記。
mysqli_stmt_bind_param($stmt, 's',$name);//將邦定的變量$name值傳遞給參數(shù)("?" 標記),s表明$name數(shù)據(jù)類型。
mysqli_stmt_execute($stmt);//執(zhí)行預處理語句,應用可以多次執(zhí)行語句,如果參數(shù)的值不一樣。
$result = mysqli_stmt_get_result($stmt);//從預處理語句中獲取結(jié)果集。
3 防御XSS攻擊endprint
XSS(Cross Site Scripting,跨站腳本攻擊)產(chǎn)生的原因是將來自用戶輸入的數(shù)據(jù)未經(jīng)過濾就拼接到HTML頁面中,造成攻擊者可以輸入JavaScript代碼來盜取系統(tǒng)用戶的Cookie、破壞頁面結(jié)構(gòu)、重定向到其它網(wǎng)站等。由于Cookie在系統(tǒng)中承載著保存用戶登錄信息的作用,一旦Cookie被盜取,攻擊者就得到了受害用戶登錄后的權(quán)限,造成一系列危險的后果。
在防御XSS攻擊時,對于普通的文本數(shù)據(jù),使用htmlspecialchars()是最好的方法。該函數(shù)可以轉(zhuǎn)義字符串中的雙引號、尖括號等特殊字符,但是默認情況下,單引號不會被轉(zhuǎn)義。例如,以下代碼存在XSS漏洞。
$name = htmlspecialchars($_POST['name']);//接收來自用戶輸入的數(shù)據(jù)
echo "";//拼接到HTML中
上述代碼中,由于用戶可以輸入單引號,因此可以通過單引號閉合原有的value屬性,然后在后面可以添加事件屬性如onclick,通過這種方式來注入JavaScript代碼,如下所示。
假設用戶輸入“' onclick='alert(document.cookie)”,輸出結(jié)果為:
上述代碼被瀏覽器執(zhí)行后,攻擊者注入的JavaScript代碼就會運行,這將威脅信息系統(tǒng)和用戶的安全。由于XSS攻擊的主要目的是盜取Cookie,因此可以為系統(tǒng)中最關(guān)鍵的PHPSESSID這個Cookie設置HttpOnly屬性。通過該屬性可以阻止JavaScript訪問該Cookie。
4 數(shù)據(jù)安全存儲
4.1 混淆密碼算法
當信息系統(tǒng)因漏洞導致數(shù)據(jù)被泄漏時,管理人員往往無法在第一時間知道,一旦用戶的密碼遭到竊取,將造成難以挽回的損失。因此,在信息系統(tǒng)開發(fā)時,要加強密碼存儲的安全性,此時通常用到單項散列函數(shù),比如md5,sha等。函數(shù)對密碼進行摘要運算,用于校驗兩個數(shù)據(jù)是否相同。如md5函數(shù)運算后得到一個由32個字符組成的信息摘要,不同的數(shù)據(jù)產(chǎn)生的md5信息摘要不同。理論上,通過md5生成的字符串無法逆向獲得原始數(shù)據(jù)。sha-1算法的安全性逐年降低,已被由安全強度更高的sha-2替代,sha-2系列包括sha-224、sha-256、sha-384和sha-512。其中,sha-256和sha-512分別生成256和512比特長度的hash字符串,都是比較常見的安全領域的hash應用。而sha-256比md5等更具安全性,也是sha系列算法最快的。
但隨著密碼學研究的不斷深入和計算機技術(shù)的快速發(fā)展,許多密碼破解機構(gòu)使用了彩虹表等技術(shù)運算并存儲了海量字符串的md5運行結(jié)果,導致對密碼直接進行MD5運行已經(jīng)無法滿足安全需求,此時可以采用混淆式的密碼算法以提高破解難度?;煜揭皇菍γ艽a進行加密存儲時,首先對密碼進行md5運算,對密碼的運算結(jié)果再連接salt即鹽值進行第二次或多次md5運算。另外,對密碼進行存儲時,通常會為不同的用戶加不同的salt,從而進一步加強密碼破解的難度。函數(shù)md5(CONCAT(md5(密碼),鹽值))兩次運算結(jié)果連同佐料可以使INSERT INTO語句存儲到數(shù)據(jù)庫中?;煜蕉窍葐⒂没煜揭贿M行加密。接下來使用函數(shù)str_split()將密文按照字符分隔成數(shù)組,函數(shù)array_map(‘ord,數(shù)組)將密文的每個字符轉(zhuǎn)換成ASCII碼值,然后使用函數(shù)hash("sha256",ASCII碼值)對ASCII碼值一一加密,最終生產(chǎn)2048個字符的密文。在登錄時取出數(shù)據(jù)庫中保存的密碼和salt,然后對用戶輸入的密碼按照salt調(diào)用如下的password()函數(shù)進行運算或再進行Hash函數(shù)運算,如果運算結(jié)果與數(shù)據(jù)庫中保存的結(jié)果相同,則成功登錄?;煜用芊绞奖容^多,再比如如基于md5與base64的混合加密算法,以上這些加密算法都能增強采用彩虹表技術(shù)逆向破解的難度。
function password($password, $salt)
{return md5(md5($password).$salt);}
4.2 加密擴展庫
md5()的功能方面存在一定的限制,PHP加密擴展庫Mcrypt、OpenSSL和Mhash則提供了更加全面的加密與解密方法。其中,Mcrypt擴展庫提供了類型、算法及模式繁多的加解密功能。Mcrypt支持的數(shù)據(jù)加密模式MCRYPT_MODE_ECB適用于短小隨機數(shù)據(jù)的加密,可以用這種模式來加密其它密鑰。如要加密安全等級較高的重要文件,可選擇MCRYPT_MODE_CBC加密模式。而MCRYPT_MODE_CFB模式對于每個單獨的字節(jié)都進行加密,所以非常適用于針對字節(jié)流的加密。MCRYPT_MODE_NOFB由于采用了塊操作算法,安全性更高。為了提高安全性,可以對密鑰進行加密,如$key= hash('sha256', 'thisis a secret key', true),這樣生成256比特的密鑰。此時再用Mcrypt的加密函數(shù)去加密數(shù)據(jù)。在解密時解密函數(shù)用到的算法、密鑰以及加密模式等參數(shù)必須和加密函數(shù)一致,否則數(shù)據(jù)不會被還原,所以說mcrypt常用在對稱加密中。openssl擴展使用openssl加密擴展包,封裝了多個用于加密解密相關(guān)的PHP函數(shù),極大地方便了對數(shù)據(jù)的加密解密,OpenSSL常用在非對稱加密中。非對稱加密的核心思想是使用一對相對的密鑰,分為公鑰和私鑰,私鑰自己安全保存,而將公鑰公開。如果用公鑰對數(shù)據(jù)進行加密,只有用對應的私鑰才能解密。如果用私鑰對數(shù)據(jù)進行加密,那么只有用對應的公鑰才能解密。非對稱加密克服了對稱加密中密鑰的保管問題,因為對稱加密中消息發(fā)送方和接收方任意一方的密鑰丟失,都會導致信息傳輸變得不安全。Mhash是基于離散數(shù)學原理的不可逆向的php加密方式擴展庫,支持MD5、SHA、CRC32等多種散列算法,可以通過mhash()函數(shù)、mhash_keygen_s2k()函數(shù)創(chuàng)建信息摘要和校驗值。
5 結(jié)束語
信息系統(tǒng)建設面臨著不少的安全隱患,其安全性建設是一個全方位長期不斷完善的過程,本文從非法表單提交的角度出發(fā),對系統(tǒng)數(shù)據(jù)的安全性進行分析與探討,以期能給用戶提供一些便利。
參考文獻:
[1]鞏明.基于PHP實現(xiàn)數(shù)據(jù)安全性的方法及比較[J].通訊世界,2015(05).
[2]劉家棟.PHP網(wǎng)站常見安全漏洞及防范措施[J].計算機與網(wǎng)絡,2016(Z1).
[3]焦顯偉,閆品.基于PHP招生管理信息系統(tǒng)[J].價值工程,2016(29).endprint