CodeIgniter 安全

2018-07-21 15:38 更新

安全

這篇文章將介紹一些基本的關(guān)于 Web 安全的 "最佳實踐" ,并詳細說明了 CodeIgniter 內(nèi)部的安全特性。

URI 安全

CodeIgniter 嚴格限制 URI 中允許出現(xiàn)的字符,以此來減少惡意數(shù)據(jù)傳到你的應(yīng)用程序的可能性。 URI 中只允許包含一些字符:

  • 字母和數(shù)字
  • 波浪符:~
  • 百分號:%
  • 句號:.
  • 分號::
  • 下劃線:_
  • 連字號:-
  • 空格

Register_globals

在系統(tǒng)初始化期間,如果發(fā)現(xiàn)任何 $_GET、$_POST、$_REQUEST 和 $_COOKIE 數(shù)組中的鍵值變成了全局變量,則刪除該變量。

這個過程和設(shè)置 register_globals = off 效果是一樣的。 (譯注:閱讀這里了解 register_globals 設(shè)置 )

display_errors

在生產(chǎn)環(huán)境下,一般都是通過將 display_errors 標志設(shè)置為 0 來禁用 PHP 的錯誤報告。 這可以阻止原生的 PHP 錯誤被顯示到頁面上,錯誤中可能會包含潛在的敏感信息。

在 CodeIgniter 中,可以將 index.php 文件中的 ENVIRONMENT 常量設(shè)置為 'production' , 這樣也可以關(guān)閉這些錯誤信息。在開發(fā)模式下,建議將它設(shè)置為 'development' 。 關(guān)于不同環(huán)境之間的區(qū)別可以閱讀 處理多環(huán)境 頁面了解更多。

magic_quotes_runtime

在系統(tǒng)初始化期間, magic_quotes_runtime 指令會被禁用, 這樣當你在從數(shù)據(jù)庫中獲取數(shù)據(jù)時就不用再去除反斜線了。

最佳實踐

在你的應(yīng)用程序處理任何數(shù)據(jù)之前,無論這些數(shù)據(jù)是來自于提交的表單 POST ,還是來自 COOKIE、URI、XML-RPC ,或者甚至是來自于 SERVER 數(shù)組,你都應(yīng)該使用下面這三步 來處理:

  1. 驗證數(shù)據(jù)類型是否正確,以及長度、大小等等
  2. 過濾不良數(shù)據(jù)
  3. 在提交到數(shù)據(jù)庫或者顯示到瀏覽器之前對數(shù)據(jù)進行轉(zhuǎn)義

CodeIgniter 提供了以下的方法和技巧來幫你處理該過程:

XSS 過濾

CodeIgniter 自帶有一個 XSS 過濾器,這個過濾器可以查找一些 XSS 的常用技術(shù), 譬如向你的數(shù)據(jù)中嵌入惡意的 JavaScript 腳本,劫持 cookie 信息或其他一些技術(shù)。 XSS 過濾器在 這里 有更詳細的描述。

注解
XSS 過濾 只應(yīng)該在輸出數(shù)據(jù)時使用 。 對輸入的數(shù)據(jù)進行過濾可能會 在無意中對數(shù)據(jù)造成修改,譬如過濾密碼中的特殊字符,這樣會降低安全性, 而不是提高安全性。

CSRF 保護

CSRF(Cross-Site Request Forgery,跨站請求偽造)是攻擊者騙取受害者 在不知情的情況下提交請求的攻擊方式。

CodeIgniter 提供了對 CSRF 的保護,會在每個非 GET HTTP 請求時自動觸發(fā), 當然前提是你要使用某種方式來創(chuàng)建表單,這在 安全類 文檔中有進一步的解釋。

密碼處理

在你的應(yīng)用程序中正確處理密碼是非常關(guān)鍵的。

但是不幸的是,許多開發(fā)者并不知道怎么去做,而且網(wǎng)絡(luò)上充斥著大量過時的 甚至錯誤的建議,提供不了任何幫助。

我們提供了一個清單來幫助你,告訴你什么該做,什么不該做。

  • 絕不要以明文存儲密碼。

    永遠使用 哈希算法 來處理密碼。

  • 絕不要使用 Base64 或其他編碼方式來存儲密碼。

    這和以明文存儲密碼是一樣的,使用 哈希 ,而不要使用 編碼 。

    編碼以及加密,都是雙向的過程,而密碼是保密的,應(yīng)該只被它的所有者知道, 這個過程必須是單向的。哈希正是用于做這個的,從來沒有解哈希這種說法, 但是編碼就存在解碼,加密就存在解密。

  • 絕不要使用弱哈?;蛞驯黄平獾墓K惴ǎ?MD5 或 SHA1 。

    這些算法太老了,而且被證明存在缺陷,它們一開始就并不是為了保存密碼而設(shè)計的。

    另外,絕不要自己發(fā)明算法。

    只使用強密碼哈希算法,譬如 BCrypt ,在 PHP 自己的 密碼哈希 函數(shù)中也是使用它。

    即使你的 PHP 版本不是 5.5+ ,也請使用它們,CodeIgniter 為你提供了這些算法,只要你的 PHP 版本是 5.3.7 以上都可以使用。(如果不滿足這點要求,那么請升級你的 PHP)

    如果你連升級 PHP 也無法做到,那么使用 hash_pbkdf()  吧, 為實現(xiàn)兼容性我們提供了這個函數(shù)。

  • 絕不要以明文形式顯示或發(fā)送密碼。

    即使是對密碼的所有者也應(yīng)該這樣。如果你需要 "忘記密碼" 的功能,可以隨機生成一個新的 一次性的(這點很重要)密碼,然后把這個密碼發(fā)送給用戶。

  • 絕不要對用戶的密碼做一些沒必要的限制。

    如果你使用除 BCrypt (它有最多 72 字符的限制)之外的其他哈希算法,你應(yīng)該設(shè)置一個相對 長一點的密碼長度(例如 1024 字符),這樣可以緩解 DoS 攻擊 。(這樣可以緩解 DoS 攻擊?)

    但是除此之外,對密碼的其他限制諸如密碼中只允許使用某些字符,或者密碼中不允許包含某些字符, 就沒有任何意義了。

    這樣做不僅不會提高安全性,反而降低了安全性,而且真的沒有任何理由需要這樣做。 只要你對密碼進行哈希處理了,那么無論是技術(shù)上,還是在存儲上都沒有任何限制。

驗證輸入數(shù)據(jù)

CodeIgniter 有一個 表單驗證類 用于幫助你驗證、 過濾以及預(yù)處理你的數(shù)據(jù)。

就算這個類不適用于你的使用場景,那么你也應(yīng)該確保對輸入數(shù)據(jù)進行驗證過濾。 例如,你希望接受一個數(shù)字型的參數(shù),你可以使用 is_numeric() 或ctype_digit() 函數(shù)來檢查一下。永遠將數(shù)據(jù)限制在你運行的范圍內(nèi)。

記住,不僅要驗證 $_POST 和 $_GET 變量,而且也不要放過 cookie 、user-agent 以及 其他所有的不是直接由你的代碼生成的數(shù)據(jù) 。

插入數(shù)據(jù)庫之前對數(shù)據(jù)進行轉(zhuǎn)義

永遠不要不做轉(zhuǎn)義就將數(shù)據(jù)插入到數(shù)據(jù)庫,更多信息,可以閱讀 數(shù)據(jù)庫查詢 這一節(jié)。

隱藏你的文件

另一個很好的安全實踐是,在你的 webroot 目錄(通常目錄名為 "htdocs/")下只保留 index.php 文件和 "assets" 目錄(用于存放 js、css、圖片等靜態(tài)資源)。 只需要這些文件能從 Web 上訪問就可以了。

允許你的訪問者訪問其他位置可能潛在的導(dǎo)致他們訪問一些敏感數(shù)據(jù)或者執(zhí)行腳本等等。

如果你不允許這樣做,你可以使用 .htaccess 文件來限制對這些資源的訪問。

CodeIgniter 在每個目錄下放置了一個 index.html 文件,試圖隱藏這些敏感數(shù)據(jù), 但是要記住的是,這對于防止一個真正的攻擊者來說并不夠。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號