世俱杯规则-虎牙直播-比利亚vs西班牙人-德国杯|www.cnyhmy.com

基于PHP的信息系統數據安全性分析與探討

時間:2022-10-21 14:00:04 來源:網友投稿

摘要:隨著信息化技術的推動和發展,信息系統安全日益重要,本文從信息系統數據合法性、MySQLi擴展的預處理機制、混淆式的密碼算法等方面對信息系統數據安全性建設進行了分析及探討。

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.

關鍵詞:PHP;數據安全;密碼算法

Key words: PHP;data security;cryptographic algorithm

中圖分類號:TP309.2 文獻標識碼:A 文章編號:1006-4311(2017)35-0153-02

0 引言

對于互聯網企業,信息系統中承載著大量的數據,尤其是在線購物、網絡銀行等系統,對于安全性的要求非常嚴格。一旦出現安全漏洞,在嚴重情況下會導致數據泄露、篡改、竊取,造成系統癱瘓等問題,將會給企業帶來不可估量的損失,所以說系統數據安全至關重要。接下來,本文將從以下幾方面分析與探討系統數據的安全性建設問題。

1 預防非法表單提交并驗證數據合法性

任何軟件通過HTTP協議都可以向Web服務器提交數據,可以更換表單中的控件,偽造另一個表單。假設域名為“http://”的服務器中有一個edit.php文件用于接收表單信息。原表單中有一組單選按鈕,只能選擇C#或PHP。如果編造一個HTML頁面,把單選按鈕替換為文本框,內容隨意編寫,并將表單提交給http:///edit.php,而服務器無法分辨真偽表單。要預防非法表單提交,比較好的方式是根據一個惟一的字符串或時間戳生成一個令牌,并將這個令牌放在會話變量和表單隱藏域中。提交表單之后,檢查兩個令牌是否匹配。如果不匹配,就知道有人偽造表單向Web服務器發送數據。簡略代碼如下。

$token = md5(uniqid(rand(), true));$_SESSION["token"]=$token;

再者Web表單利用瀏覽器限制了提交的內容,但無法限制服務器接收什么樣的內容。因此,對于用戶輸入的內容,一定要驗證數據的合法性。在對用戶提交內容進行驗證時,可以利用正則表達式實現復雜的驗證規則。比如驗證18位身份證號。在PHP中,可以使用preg_match()函數進行正則匹配,該函數的第1個參數表示正則表達式,第2個參數表示帶匹配的字符串,返回值為匹配的次數。具體代碼如下。

$id = $_POST["id"]; //接收身份證號

if(!preg_match("^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$", $id)){ echo "身份證號格式不符合要求";} //驗證身份證號是否合法

通過preg_match()函數對身份證號進行驗證,當函數返回的匹配次數為0時,表示輸入的字符串不符合規則。

2 防御SQL注入

SQL注入是開發人員未對用戶輸入的數據進行過濾就拼接到SQL語句中執行,導致用戶輸入的一些特殊字符破壞了原有SQL語句的邏輯,造成數據被泄露、篡改、刪除等危險的后果。比如下列代碼就存在SQL注入問題。該代碼將來自外部的name數據直接拼接到SQL語句中,如果用戶輸入了單引號,則會將原有SQL語句中的單引號閉合,然后用戶就可以將自己輸入的內容當成SQL執行。

$name = $_POST["name"];

$result=mysqli_query($link, "SELECT * FROM `admin` WHERE `name`="$name"");

假設用戶輸入“"or 1="1”,SQL語句將變為SELECT * FROM `admin` WHERE `name`="" or 1="1"。此時就會通過or條件查詢出admin表中所有的記錄,造成了數據的泄露。接下來改進上述代碼,操作數據庫使用了MySQLi擴展的預處理機制,將SQL語句和數據分離,從本質上避免了SQL注入問題的發生,同時也更加高效,簡略代碼如下。

$name = $_POST["name"]; //接收變量

$stmt = mysqli_prepare($link, "SELECT * FROM `admin` WHERE `name`=?");//創建 SQL 語句模板,預留的變量$name值使用參數 "?" 標記。

mysqli_stmt_bind_param($stmt, "s",$name);//將邦定的變量$name值傳遞給參數("?" 標記),s表明$name數據類型。

mysqli_stmt_execute($stmt);//執行預處理語句,應用可以多次執行語句,如果參數的值不一樣。

$result = mysqli_stmt_get_result($stmt);//從預處理語句中獲取結果集。

3 防御XSS攻擊

XSS(Cross Site Scripting,跨站腳本攻擊)產生的原因是將來自用戶輸入的數據未經過濾就拼接到HTML頁面中,造成攻擊者可以輸入JavaScript代碼來盜取系統用戶的Cookie、破壞頁面結構、重定向到其它網站等。由于Cookie在系統中承載著保存用戶登錄信息的作用,一旦Cookie被盜取,攻擊者就得到了受害用戶登錄后的權限,造成一系列危險的后果。

在防御XSS攻擊時,對于普通的文本數據,使用htmlspecialchars()是最好的方法。該函數可以轉義字符串中的雙引號、尖括號等特殊字符,但是默認情況下,單引號不會被轉義。例如,以下代碼存在XSS漏洞。

$name = htmlspecialchars($_POST["name"]);//接收來自用戶輸入的數據

echo "";//拼接到HTML中

上述代碼中,由于用戶可以輸入單引號,因此可以通過單引號閉合原有的value屬性,然后在后面可以添加事件屬性如onclick,通過這種方式來注入JavaScript代碼,如下所示。

假設用戶輸入“" onclick="alert(document.cookie)”,輸出結果為:

上述代碼被瀏覽器執行后,攻擊者注入的JavaScript代碼就會運行,這將威脅信息系統和用戶的安全。由于XSS攻擊的主要目的是盜取Cookie,因此可以為系統中最關鍵的PHPSESSID這個Cookie設置HttpOnly屬性。通過該屬性可以阻止JavaScript訪問該Cookie。

4 數據安全存儲

4.1 混淆密碼算法

當信息系統因漏洞導致數據被泄漏時,管理人員往往無法在第一時間知道,一旦用戶的密碼遭到竊取,將造成難以挽回的損失。因此,在信息系統開發時,要加強密碼存儲的安全性,此時通常用到單項散列函數,比如md5,sha等。函數對密碼進行摘要運算,用于校驗兩個數據是否相同。如md5函數運算后得到一個由32個字符組成的信息摘要,不同的數據產生的md5信息摘要不同。理論上,通過md5生成的字符串無法逆向獲得原始數據。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系列算法最快的。

但隨著密碼學研究的不斷深入和計算機技術的快速發展,許多密碼**機構使用了彩虹表等技術運算并存儲了海量字符串的md5運行結果,導致對密碼直接進行MD5運行已經無法滿足安全需求,此時可以采用混淆式的密碼算法以提高**難度?;煜揭皇菍γ艽a進行加密存儲時,首先對密碼進行md5運算,對密碼的運算結果再連接salt即鹽值進行第二次或多次md5運算。另外,對密碼進行存儲時,通常會為不同的用戶加不同的salt,從而進一步加強密碼**的難度。函數md5(CONCAT(md5(密碼),鹽值))兩次運算結果連同佐料可以使INSERT INTO語句存儲到數據庫中。混淆式二是先啟用混淆式一進行加密。接下來使用函數str_split()將密文按照字符分隔成數組,函數array_map(‘ord’,數組)將密文的每個字符轉換成ASCII碼值,然后使用函數hash("sha256",ASCII碼值)對ASCII碼值一一加密,最終生產2048個字符的密文。在登錄時取出數據庫中保存的密碼和salt,然后對用戶輸入的密碼按照salt調用如下的password()函數進行運算或再進行Hash函數運算,如果運算結果與數據庫中保存的結果相同,則成功登錄。混淆加密方式比較多,再比如如基于md5與base64的混合加密算法,以上這些加密算法都能增強采用彩虹表技術逆向**的難度。

function password($password, $salt)

{return md5(md5($password).$salt);}

4.2 加密擴展庫

md5()的功能方面存在一定的限制,PHP加密擴展庫Mcrypt、OpenSSL和Mhash則提供了更加全面的加密與解密方法。其中,Mcrypt擴展庫提供了類型、算法及模式繁多的加解密功能。Mcrypt支持的數據加密模式MCRYPT_MODE_ECB適用于短小隨機數據的加密,可以用這種模式來加密其它密鑰。如要加密安全等級較高的重要文件,可選擇MCRYPT_MODE_CBC加密模式。而MCRYPT_MODE_CFB模式對于每個單獨的字節都進行加密,所以非常適用于針對字節流的加密。MCRYPT_MODE_NOFB由于采用了塊操作算法,安全性更高。為了提高安全性,可以對密鑰進行加密,如$key= hash("sha256", "thisis a secret key", true),這樣生成256比特的密鑰。此時再用Mcrypt的加密函數去加密數據。在解密時解密函數用到的算法、密鑰以及加密模式等參數必須和加密函數一致,否則數據不會被還原,所以說mcrypt常用在對稱加密中。openssl擴展使用openssl加密擴展包,封裝了多個用于加密解密相關的PHP函數,極大地方便了對數據的加密解密,OpenSSL常用在非對稱加密中。非對稱加密的核心思想是使用一對相對的密鑰,分為公鑰和私鑰,私鑰自己安全保存,而將公鑰公開。如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。如果用私鑰對數據進行加密,那么只有用對應的公鑰才能解密。非對稱加密克服了對稱加密中密鑰的保管問題,因為對稱加密中消息發送方和接收方任意一方的密鑰丟失,都會導致信息傳輸變得不安全。Mhash是基于離散數學原理的不可逆向的php加密方式擴展庫,支持MD5、SHA、CRC32等多種散列算法,可以通過mhash()函數、mhash_keygen_s2k()函數創建信息摘要和校驗值。

5 結束語

信息系統建設面臨著不少的安全隱患,其安全性建設是一個全方位長期不斷完善的過程,本文從非法表單提交的角度出發,對系統數據的安全性進行分析與探討,以期能給用戶提供一些便利。

參考文獻:

[1]鞏明.基于PHP實現數據安全性的方法及比較[J].通訊世界,2015(05).

[2]劉家棟.PHP網站常見安全漏洞及防范措施[J].計算機與網絡,2016(Z1).

[3]焦顯偉,閆品.基于PHP招生管理信息系統[J].價值工程,2016(29).

推薦訪問:信息系統 安全性 探討 分析 數據

最新推薦
猜你喜歡