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