<dd id="saiiy"></dd>
  1. <s id="saiiy"></s>

    1. <s id="saiiy"></s>
      1. <span id="saiiy"><blockquote id="saiiy"></blockquote></span>

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

        發(fā)布時(shí)間:2025-06-11 13:03:28   來(lái)源:作文大全    點(diǎn)擊:   
        字號:

        摘要:隨著(zhù)信息化技術(shù)的推動(dòng)和發(fā)展,信息系統安全日益重要,本文從信息系統數據合法性、MySQLi擴展的預處理機制、混淆式的密碼算法等方面對信息系統數據安全性建設進(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;數據安全;密碼算法

        Key words: PHP;data security;cryptographic algorithm

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

        0 引言

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

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

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

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

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

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

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

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

        2 防御SQL注入

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

        $name = $_POST["name"];

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

        假設用戶(hù)輸入“"or 1="1”,SQL語(yǔ)句將變?yōu)镾ELECT * FROM `admin` WHERE `name`="" or 1="1"。此時(shí)就會(huì )通過(guò)or條件查詢(xún)出admin表中所有的記錄,造成了數據的泄露。接下來(lái)改進(jìn)上述代碼,操作數據庫使用了MySQLi擴展的預處理機制,將SQL語(yǔ)句和數據分離,從本質(zhì)上避免了SQL注入問(wèn)題的發(fā)生,同時(shí)也更加高效,簡(jiǎn)略代碼如下。

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

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

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

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

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

        3 防御XSS攻擊

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

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

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

        echo "";//拼接到HTML中

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

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

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

        4 數據安全存儲

        4.1 混淆密碼算法

        當信息系統因漏洞導致數據被泄漏時(shí),管理人員往往無(wú)法在第一時(shí)間知道,一旦用戶(hù)的密碼遭到竊取,將造成難以挽回的損失。因此,在信息系統開(kāi)發(fā)時(shí),要加強密碼存儲的安全性,此時(shí)通常用到單項散列函數,比如md5,sha等。函數對密碼進(jìn)行摘要運算,用于校驗兩個(gè)數據是否相同。如md5函數運算后得到一個(gè)由32個(gè)字符組成的信息摘要,不同的數據產(chǎn)生的md5信息摘要不同。理論上,通過(guò)md5生成的字符串無(wú)法逆向獲得原始數據。sha-1算法的安全性逐年降低,已被由安全強度更高的sha-2替代,sha-2系列包括sha-224、sha-256、sha-384和sha-512。其中,sha-256和sha-512分別生成256和512比特長(cháng)度的hash字符串,都是比較常見(jiàn)的安全領(lǐng)域的hash應用。而sha-256比md5等更具安全性,也是sha系列算法最快的。

        但隨著(zhù)密碼學(xué)研究的不斷深入和計算機技術(shù)的快速發(fā)展,許多密碼破解機構使用了彩虹表等技術(shù)運算并存儲了海量字符串的md5運行結果,導致對密碼直接進(jìn)行MD5運行已經(jīng)無(wú)法滿(mǎn)足安全需求,此時(shí)可以采用混淆式的密碼算法以提高破解難度?;煜揭皇菍γ艽a進(jìn)行加密存儲時(shí),首先對密碼進(jìn)行md5運算,對密碼的運算結果再連接salt即鹽值進(jìn)行第二次或多次md5運算。另外,對密碼進(jìn)行存儲時(shí),通常會(huì )為不同的用戶(hù)加不同的salt,從而進(jìn)一步加強密碼破解的難度。函數md5(CONCAT(md5(密碼),鹽值))兩次運算結果連同佐料可以使INSERT INTO語(yǔ)句存儲到數據庫中?;煜蕉窍葐⒂没煜揭贿M(jìn)行加密。接下來(lái)使用函數str_split()將密文按照字符分隔成數組,函數array_map(‘ord’,數組)將密文的每個(gè)字符轉換成ASCII碼值,然后使用函數hash("sha256",ASCII碼值)對ASCII碼值一一加密,最終生產(chǎn)2048個(gè)字符的密文。在登錄時(shí)取出數據庫中保存的密碼和salt,然后對用戶(hù)輸入的密碼按照salt調用如下的password()函數進(jìn)行運算或再進(jìn)行Hash函數運算,如果運算結果與數據庫中保存的結果相同,則成功登錄?;煜用芊绞奖容^多,再比如如基于md5與base64的混合加密算法,以上這些加密算法都能增強采用彩虹表技術(shù)逆向破解的難度。

        function password($password, $salt)

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

        4.2 加密擴展庫

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

        5 結束語(yǔ)

        信息系統建設面臨著(zhù)不少的安全隱患,其安全性建設是一個(gè)全方位長(cháng)期不斷完善的過(guò)程,本文從非法表單提交的角度出發(fā),對系統數據的安全性進(jìn)行分析與探討,以期能給用戶(hù)提供一些便利。

        參考文獻:

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

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

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

        国产另类无码专区|日本教师强伦姧在线观|看纯日姘一级毛片|91久久夜色精品国产按摩|337p日本欧洲亚洲大胆精

        <dd id="saiiy"></dd>
        1. <s id="saiiy"></s>

          1. <s id="saiiy"></s>
            1. <span id="saiiy"><blockquote id="saiiy"></blockquote></span>