W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
這篇文章將介紹一些基本的關(guān)于 Web 安全的 "最佳實(shí)踐" ,并詳細(xì)說明了 CodeIgniter 內(nèi)部的安全特性。
CodeIgniter 嚴(yán)格限制 URI 中允許出現(xiàn)的字符,以此來減少惡意數(shù)據(jù)傳到你的應(yīng)用程序的可能性。 URI 中只允許包含一些字符:
在系統(tǒng)初始化期間,如果發(fā)現(xiàn)任何 $_GET、$_POST、$_REQUEST 和 $_COOKIE 數(shù)組中的鍵值變成了全局變量,則刪除該變量。
這個(gè)過程和設(shè)置 register_globals = off 效果是一樣的。 (譯注:閱讀這里了解 register_globals 設(shè)置 )
在生產(chǎn)環(huán)境下,一般都是通過將 display_errors 標(biāo)志設(shè)置為 0 來禁用 PHP 的錯(cuò)誤報(bào)告。 這可以阻止原生的 PHP 錯(cuò)誤被顯示到頁面上,錯(cuò)誤中可能會(huì)包含潛在的敏感信息。
在 CodeIgniter 中,可以將 index.php 文件中的 ENVIRONMENT 常量設(shè)置為 'production' , 這樣也可以關(guān)閉這些錯(cuò)誤信息。在開發(fā)模式下,建議將它設(shè)置為 'development' 。 關(guān)于不同環(huán)境之間的區(qū)別可以閱讀 處理多環(huán)境 頁面了解更多。
在系統(tǒng)初始化期間, magic_quotes_runtime 指令會(huì)被禁用, 這樣當(dāng)你在從數(shù)據(jù)庫中獲取數(shù)據(jù)時(shí)就不用再去除反斜線了。
在你的應(yīng)用程序處理任何數(shù)據(jù)之前,無論這些數(shù)據(jù)是來自于提交的表單 POST ,還是來自 COOKIE、URI、XML-RPC ,或者甚至是來自于 SERVER 數(shù)組,你都應(yīng)該使用下面這三步 來處理:
CodeIgniter 提供了以下的方法和技巧來幫你處理該過程:
CodeIgniter 自帶有一個(gè) XSS 過濾器,這個(gè)過濾器可以查找一些 XSS 的常用技術(shù), 譬如向你的數(shù)據(jù)中嵌入惡意的 JavaScript 腳本,劫持 cookie 信息或其他一些技術(shù)。 XSS 過濾器在 這里 有更詳細(xì)的描述。
注解
XSS 過濾 只應(yīng)該在輸出數(shù)據(jù)時(shí)使用 。 對輸入的數(shù)據(jù)進(jìn)行過濾可能會(huì) 在無意中對數(shù)據(jù)造成修改,譬如過濾密碼中的特殊字符,這樣會(huì)降低安全性, 而不是提高安全性。
CSRF(Cross-Site Request Forgery,跨站請求偽造)是攻擊者騙取受害者 在不知情的情況下提交請求的攻擊方式。
CodeIgniter 提供了對 CSRF 的保護(hù),會(huì)在每個(gè)非 GET HTTP 請求時(shí)自動(dòng)觸發(fā), 當(dāng)然前提是你要使用某種方式來創(chuàng)建表單,這在 安全類 文檔中有進(jìn)一步的解釋。
在你的應(yīng)用程序中正確處理密碼是非常關(guān)鍵的。
但是不幸的是,許多開發(fā)者并不知道怎么去做,而且網(wǎng)絡(luò)上充斥著大量過時(shí)的 甚至錯(cuò)誤的建議,提供不了任何幫助。
我們提供了一個(gè)清單來幫助你,告訴你什么該做,什么不該做。
絕不要以明文存儲(chǔ)密碼。
永遠(yuǎn)使用 哈希算法 來處理密碼。
絕不要使用 Base64 或其他編碼方式來存儲(chǔ)密碼。
這和以明文存儲(chǔ)密碼是一樣的,使用 哈希 ,而不要使用 編碼 。
編碼以及加密,都是雙向的過程,而密碼是保密的,應(yīng)該只被它的所有者知道, 這個(gè)過程必須是單向的。哈希正是用于做這個(gè)的,從來沒有解哈希這種說法, 但是編碼就存在解碼,加密就存在解密。
絕不要使用弱哈?;蛞驯黄平獾墓K惴?,像 MD5 或 SHA1 。
這些算法太老了,而且被證明存在缺陷,它們一開始就并不是為了保存密碼而設(shè)計(jì)的。
另外,絕不要自己發(fā)明算法。
只使用強(qiáng)密碼哈希算法,譬如 BCrypt ,在 PHP 自己的 密碼哈希 函數(shù)中也是使用它。
即使你的 PHP 版本不是 5.5+ ,也請使用它們,CodeIgniter 為你提供了這些算法,只要你的 PHP 版本是 5.3.7 以上都可以使用。(如果不滿足這點(diǎn)要求,那么請升級你的 PHP)
如果你連升級 PHP 也無法做到,那么使用 hash_pbkdf() 吧, 為實(shí)現(xiàn)兼容性我們提供了這個(gè)函數(shù)。
絕不要以明文形式顯示或發(fā)送密碼。
即使是對密碼的所有者也應(yīng)該這樣。如果你需要 "忘記密碼" 的功能,可以隨機(jī)生成一個(gè)新的 一次性的(這點(diǎn)很重要)密碼,然后把這個(gè)密碼發(fā)送給用戶。
絕不要對用戶的密碼做一些沒必要的限制。
如果你使用除 BCrypt (它有最多 72 字符的限制)之外的其他哈希算法,你應(yīng)該設(shè)置一個(gè)相對 長一點(diǎn)的密碼長度(例如 1024 字符),這樣可以緩解 DoS 攻擊 。(這樣可以緩解 DoS 攻擊?)
但是除此之外,對密碼的其他限制諸如密碼中只允許使用某些字符,或者密碼中不允許包含某些字符, 就沒有任何意義了。
這樣做不僅不會(huì)提高安全性,反而降低了安全性,而且真的沒有任何理由需要這樣做。 只要你對密碼進(jìn)行哈希處理了,那么無論是技術(shù)上,還是在存儲(chǔ)上都沒有任何限制。
CodeIgniter 有一個(gè) 表單驗(yàn)證類 用于幫助你驗(yàn)證、 過濾以及預(yù)處理你的數(shù)據(jù)。
就算這個(gè)類不適用于你的使用場景,那么你也應(yīng)該確保對輸入數(shù)據(jù)進(jìn)行驗(yàn)證過濾。 例如,你希望接受一個(gè)數(shù)字型的參數(shù),你可以使用 is_numeric() 或ctype_digit() 函數(shù)來檢查一下。永遠(yuǎn)將數(shù)據(jù)限制在你運(yùn)行的范圍內(nèi)。
記住,不僅要驗(yàn)證 $_POST 和 $_GET 變量,而且也不要放過 cookie 、user-agent 以及 其他所有的不是直接由你的代碼生成的數(shù)據(jù) 。
永遠(yuǎn)不要不做轉(zhuǎn)義就將數(shù)據(jù)插入到數(shù)據(jù)庫,更多信息,可以閱讀 數(shù)據(jù)庫查詢 這一節(jié)。
另一個(gè)很好的安全實(shí)踐是,在你的 webroot 目錄(通常目錄名為 "htdocs/")下只保留 index.php 文件和 "assets" 目錄(用于存放 js、css、圖片等靜態(tài)資源)。 只需要這些文件能從 Web 上訪問就可以了。
允許你的訪問者訪問其他位置可能潛在的導(dǎo)致他們訪問一些敏感數(shù)據(jù)或者執(zhí)行腳本等等。
如果你不允許這樣做,你可以使用 .htaccess 文件來限制對這些資源的訪問。
CodeIgniter 在每個(gè)目錄下放置了一個(gè) index.html 文件,試圖隱藏這些敏感數(shù)據(jù), 但是要記住的是,這對于防止一個(gè)真正的攻擊者來說并不夠。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: