PHP安全之?dāng)?shù)據(jù)庫(kù)安全——設(shè)計(jì)、連接和加密
第一步一般都是創(chuàng)建數(shù)據(jù)庫(kù),除非是使用第三方的數(shù)據(jù)庫(kù)服務(wù)。當(dāng)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)的時(shí)候,會(huì)指定一個(gè)所有者來(lái)執(zhí)行和新建語(yǔ)句。通常,只有所有者(或超級(jí)用戶(hù))才有權(quán)對(duì)數(shù)據(jù)庫(kù)中的對(duì)象進(jìn)行任意操作。如果想讓其他用戶(hù)使用,就必須賦予他們權(quán)限。
應(yīng)用程序永遠(yuǎn)不要使用數(shù)據(jù)庫(kù)所有者或超級(jí)用戶(hù)帳號(hào)來(lái)連接數(shù)據(jù)庫(kù),因?yàn)檫@些帳號(hào)可以執(zhí)行任意的操作,比如說(shuō)修改數(shù)據(jù)庫(kù)結(jié)構(gòu)(例如刪除一個(gè)表)或者清空整個(gè)數(shù)據(jù)庫(kù)的內(nèi)容。
應(yīng)該為程序的每個(gè)方面創(chuàng)建不同的數(shù)據(jù)庫(kù)帳號(hào),并賦予對(duì)數(shù)據(jù)庫(kù)對(duì)象的極有限的權(quán)限。僅分配給能完成其功能所需的權(quán)限,避免同一個(gè)用戶(hù)可以完成另一個(gè)用戶(hù)的事情。這樣即使攻擊者利用程序漏洞取得了數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)限,也最多只能做到和該程序一樣的影響范圍。
鼓勵(lì)用戶(hù)不要把所有的事務(wù)邏輯都用 web 應(yīng)用程序(即用戶(hù)的腳本)來(lái)實(shí)現(xiàn)。最好用視圖(view)、觸發(fā)器(trigger)或者規(guī)則(rule)在數(shù)據(jù)庫(kù)層面完成。當(dāng)系統(tǒng)升級(jí)的時(shí)候,需要為數(shù)據(jù)庫(kù)開(kāi)辟新的接口,這時(shí)就必須重做所有的數(shù)據(jù)庫(kù)客戶(hù)端。除此之外,觸發(fā)器還可以透明和自動(dòng)地處理字段,并在調(diào)試程序和跟蹤事實(shí)時(shí)提供有用的信息。
連接數(shù)據(jù)庫(kù)把連接建立在 SSL 加密技術(shù)上可以增加客戶(hù)端和服務(wù)器端通信的安全性,或者 SSH 也可以用于加密客戶(hù)端和數(shù)據(jù)庫(kù)之間的連接。如果使用了這些技術(shù)的話,攻擊者要監(jiān)視服務(wù)器的通信或者得到數(shù)據(jù)庫(kù)的信息是很困難的。
加密存儲(chǔ)模型SSL/SSH 能保護(hù)客戶(hù)端和服務(wù)器端交換的數(shù)據(jù),但 SSL/SSH 并不能保護(hù)數(shù)據(jù)庫(kù)中已有的數(shù)據(jù)。SSL 只是一個(gè)加密網(wǎng)絡(luò)數(shù)據(jù)流的協(xié)議。
如果攻擊者取得了直接訪問(wèn)數(shù)據(jù)庫(kù)的許可(繞過(guò) web 服務(wù)器),敏感數(shù)據(jù)就可能暴露或者被濫用,除非數(shù)據(jù)庫(kù)自己保護(hù)了這些信息。對(duì)數(shù)據(jù)庫(kù)內(nèi)的數(shù)據(jù)加密是減少這類(lèi)風(fēng)險(xiǎn)的有效途徑,但是只有很少的數(shù)據(jù)庫(kù)提供這些加密功能。
對(duì)于這個(gè)問(wèn)題,有一個(gè)簡(jiǎn)單的解決辦法,就是創(chuàng)建自己的加密機(jī)制,然后把它用在 PHP 程序內(nèi)。PHP 有幾個(gè)擴(kuò)展庫(kù)可以完成這個(gè)工作,比如說(shuō)?Mcrypt?和?Mhash?等,它們包含多種加密運(yùn)算法則。腳本在插入數(shù)據(jù)庫(kù)之前先把數(shù)據(jù)加密,以后提取出來(lái)時(shí)再解密。
對(duì)某些真正隱蔽的數(shù)據(jù),如果不需要以明文的形式存在(即不用顯示),可以考慮用散列算法。使用散列算法最常見(jiàn)的例子就是把密碼經(jīng)過(guò) MD5 加密后的散列存進(jìn)數(shù)據(jù)庫(kù)來(lái)代替原來(lái)的明文密碼。
Example #1 對(duì)密碼字段進(jìn)行散列加密
<?php // 存儲(chǔ)密碼散列 $query = sprintf('INSERT INTO users(name,pwd) VALUES(’%s’,’%s’);', pg_escape_string($username), md5($password)); $result = pg_query($connection, $query); // 發(fā)送請(qǐng)求來(lái)驗(yàn)證用戶(hù)密碼 $query = sprintf('SELECT 1 FROM users WHERE name=’%s’ AND pwd=’%s’;', pg_escape_string($username), md5($password)); $result = pg_query($connection, $query); if (pg_num_rows($result) > 0) {echo ’Welcome, $username!’; } else {echo ’Authentication failed for $username.’; }?>
相關(guān)文章:
1. CSS可以做的幾個(gè)令你嘆為觀止的實(shí)例分享2. vue前端RSA加密java后端解密的方法實(shí)現(xiàn)3. php使用正則驗(yàn)證密碼字段的復(fù)雜強(qiáng)度原理詳細(xì)講解 原創(chuàng)4. JSP+Servlet實(shí)現(xiàn)文件上傳到服務(wù)器功能5. vue項(xiàng)目登錄成功拿到令牌跳轉(zhuǎn)失敗401無(wú)登錄信息的解決6. 基于javaweb+jsp實(shí)現(xiàn)企業(yè)財(cái)務(wù)記賬管理系統(tǒng)7. asp批量添加修改刪除操作示例代碼8. ASP動(dòng)態(tài)網(wǎng)頁(yè)制作技術(shù)經(jīng)驗(yàn)分享9. ASP中實(shí)現(xiàn)字符部位類(lèi)似.NET里String對(duì)象的PadLeft和PadRight函數(shù)10. 淺談?dòng)蓀osition屬性引申的css進(jìn)階討論

網(wǎng)公網(wǎng)安備