阅读“CodeIgniter中国》文档首页》常规主题》安全”之抄录
一、安全
? ? ?1.1 URI 安全
? ? ? ?Codeigniter嚴格限制URI中允許出現的字符,以此來減少惡意數據傳到你的應用程序的可能性。URI中只允許包含一些字符:
? ? ? ?a.字母和數字? ? ? ? ?b.波浪符:~? ? ? ? ? ?c.百分號:%? ? ? ? ? ? ?d.句號:.
? ? ? ?e.冒號::? ? ? ? ? ? ? ? ? f.下劃線:_? ? ? ? ? ? ?g.連字號:-? ? ? ? ? ? ? h.空格?
? ? ?1.2 Register_globals
? ? ? ? ?在系統初始化期間,如果發現任何$_GET、$_POST、$_REQUEST和$_COOKIE 數組中的鍵值變成了全局變量,則刪除該變量。
? ? ? ? ? 這個過程和設置register_globals=off效果是一樣的。
? ? ?1.3 display_errors
? ? ? ?在生產環境下,一般都是通過將display_errors標志設置為0來禁用PHP的錯誤報告。這可以阻止原生的PHP錯誤被顯示到頁面上,錯誤中可能會包含潛在的敏感信息。
? ? ? ?在CodeIgniter中,可以將index.php文件中的ENVIRONMENT常量設置為'production',這樣也可以關閉這些錯誤信息。
? ? ? 1.4 magic_quotes_runtime
? ? ? ? ?在系統初始化期間,magic_quotes_runtime指令會被禁用,這樣當你在從數據庫中獲取數據時就不用再去除反斜線了。
? ? ? 1.5 最佳實踐
? ? ? ? ?在你的應用程序處理任何數據之前,無論這些數據是來自于提交的表單POST,還是來自COOKIE、URI、XML-RPC,或者甚至是來自于SERVER數組,你都應該使用下面這三步來處理:
? ? ? ? ? a.驗證數據類型是否正確,以及長度、大小等等
? ? ? ? ? b.過濾不良數據。
? ? ? ? ? c.在提交到數據庫或者顯示到瀏覽器之前對數據進行轉義
? ? ? CodeIgniter提供了以下的方法和技巧來幫你處理該過程:
? ? ? ? 1.6 XSS過濾
? ? ? ? ? ?CodeIgniter自帶有一個XSS過濾器,這個過濾器可以查找一些XSS的常用技術,例如向你的數據中嵌入惡意的JavaScript腳本,劫持cookie信息或其他一些技術。XSS過濾器在這里?有更詳細的描述。
注解:XSS過濾只應該在輸出數據時使用。對輸入的數據進行過濾可能會在無意中對數據造成修改,例如過濾密碼中的特殊字符,這樣會降低安全性,而不是提高安全性。? ? ? ? ?1.7 CSRF保護
? ? ? ? ? ?CSRF(Cross-Site Request Forgery,跨站請求偽造)是攻擊者騙取受害者在不知情的情況下提交請求的攻擊方式。
? ? ? ? ? ?CodeIgniter提供了對CSRF的保護,會在每個非GET HTTP請求時自動觸發,當然前提是你要使用某種方式來創建表單,這在?安全類?文檔中有進一步的解釋。
? ? ? ? ?1.8 密碼處理
? ? ? ? ? ? ?在你的應用程序中正確處理密碼是非常關鍵的。
? ? ? ? ? ? ? 我們提供了一個清單來幫助你,告訴你什么該做,什么不該做。
? ? ? ? ? ? ? a)絕不要以明文存儲密碼。
? ? ? ? ? ? ? ? ?永遠使用哈希算法來處理密碼。
? ? ? ? ? ? ? ?b)絕不要使用Base64或其他編碼方式來存儲密碼。這和以明文存儲密碼是一樣的,使用哈希,而不要使用編碼。編碼以及加密,都是雙向的過程,而密碼是保密的,應該只被它的所有者知道,這個過程必須是單向的。哈希正是用于做這個的,從來沒有解哈希這種說法,但是編碼就存在解碼,加密就存在解密。
? ? ? ? ? ? ? ?c) 絕不要使用弱哈希或已被破解的哈希算法,像MD5或SHA1.
? ? ? ? ? ? ? ? ? ?這些算法太老了,而且被證明存在缺陷,它們一開始就并不是為了保存密碼而設計的。另外,絕不要自己發明算法。
? ? ? ? ? ? ? ? ? ?只使用強密碼哈希算法,例如BCrypt,在PHP自己的?密碼哈希?函數也是使用它。
? ? ? ? ? ? ? ? d) 絕不要以明文形式顯示或發送密碼。
? ? ? ? ? ? ? ? ? ? 即使是對密碼的所有者也應該這樣。如果你需要"忘記密碼"的功能,可以隨機生成一個新的一次性的(這點很重要)密碼,然后把這個密碼發送給用戶。
? ? ? ? ? ? ? ? ?e)絕不要對用戶的密碼做一些沒必要的限制。
? ? ? ? ? ? ? ? ? ? ?如果你使用除BCrypt(它有最多72字符的限制)之外的其他哈希算法,你應該設置一個相對長一點的密碼長度(例如1024字符),這樣可以緩解DoS攻擊。
? ? ? ? ? ? ?1.9 驗證輸入數據
? ? ? ? ? ? ? ? ? CodeIgniter有一個?表單驗證類?用于幫助你驗證、過濾以及預處理你的數據。
? ? ? ? ? ? ? ? ? 就算這個類不適用于你的使用場景,那么你也應該確保對輸入數據進行驗證過濾。例如,你希望接受一個數字型的參數,你可以使用is_numeric()或ctype_digit()函數來檢查以下。永遠將數據限制在你運行的范圍內。
? ? ? ? ? ? ? ? ? ?記住,不僅要驗證$_POST和$_GET變量,而且也不要放過cookie、user-agent以及其他所有的不是直接由你的代碼生成的數據。
? ? ? ? ? ? ? ?2.0 插入數據庫之前對數據進行轉義
? ? ? ? ? ? ? ? ? ?永遠不要不做轉義就將數據插入到數據庫,更多信息,可以閱讀?數據庫查詢?.
? ? ? ? ? ? ? ?2.1 隱藏你的文件
? ? ? ? ? ? ? ? ? ? ?另一個很好的安全實踐是,在你的webroot目錄(通常目錄名為"htdocs/")下只保留index.php文件和"assets"目錄(用于存放js、Css、圖片等靜態資源)。只需要這些文件能從Web上訪問就可以了。
? ? ? ? ? ? ? ? ? ? ? 允許你的訪問者訪問其他位置可能潛在的導致他們訪問一些敏感數據或者執行腳本等等。
? ? ? ? ? ? ? ? ? ? ? 如果你不允許這樣做,你可以使用.htaccess文件來限制對這些資源的訪問。
? ? ? ? ? ? ? ? ? ? ? CodeIgniter在每個目錄下防止了一個index.html文件,試圖隱藏這些敏感數據,但是要記住的是,這對于防止一個真正的攻擊者來說并不夠。
二、CodeIgniter特性
? ? ? ? 支持的主要特性列表:
? ? ? ? a)基于MVC體系
? ? ? ? b)超輕量級
? ? ? ? c)對數種數據庫平臺的全特性支持
? ? ? ? d)支持查詢構造器
? ? ? ? e)表單與數據驗證
? ? ? ? f)安全性與XSS過濾
? ? ? ? g)會話管理
? ? ? ? h)發送郵件類,支持附件、HTML或文本郵件、多協議(sendmail、SMTP、Mail)及更多
? ? ? ? ?i)圖像處理庫(裁剪、縮放、旋轉等),支持GD、ImageMagick和NetPBM
? ? ? ? ?j)文件上傳類
? ? ? ? ?k)FTP類
? ? ? ? ?l)本地化
? ? ? ? ?m)分頁
? ? ? ? ?n)數據加密
? ? ? ? ?o)基準測試
? ? ? ? ?p)全頁面測試
? ? ? ? ?q)錯誤日志
? ? ? ? ?r)應用程序評測
? ? ? ? ?s)日歷類
? ? ? ? ?t)User-Agent類
? ? ? ? ?u)Zip編碼類
? ? ? ? ?v)模板引擎類
? ? ? ? ?w)Trackback類
? ? ? ? ?x)XML-RPC類
? ? ? ? ?y)單元測試類
? ? ? ? ?z)搜索引擎友好的URL
? ? ? ? ?aa) 支持鉤子和類擴展
? ? ? ? ?ab) 大量的輔助函數
三、應用程序流程圖
? ? ? ?下圖說明了整個系統的數據流程:
? ? ? ??
? ? ? ? ? 1.index.php文件作為前端控制器,初始化運行CodeIgniter所需的基本資源;
? ? ? ? ? ?2.Router檢查HTTP請求,以確定如何處理該請求;
? ? ? ? ? ?3.如果存在緩存文件,將直接輸出到瀏覽器,不用走下面正常的系統流程;
? ? ? ? ? ?4.在加載應用程序控制器之前,對HTTP請求以及任何用戶提交的數據進行安全檢查;
? ? ? ? ? ?5.控制器加載模型、核心類庫、輔助函數以及其他所有處理請求所需的資源;
? ? ? ? ? ?6.最后一步,渲染視圖并發送至瀏覽器,如果開啟了緩存,視圖會被先緩存起來用于后續的請求。
四、模型-視圖-控制器
? ? ? ?CodeIgniter的開發基于MVC設計模式。MVC是一種用于將應用程序的邏輯層和表現層分離出來的軟件方法。在實踐中,由于這種分離所以你的頁面中只包含很少的PHP腳本。
? ? ? ? a)模型? 代表你的數據結構。通常來說,模型類將包含幫助你對數據庫進行增刪改查的方法。
? ? ? ? b)視圖? 是要展現給用戶的信息。一個視圖通常就是一個網頁,但是在CodeIgniter中,一個視圖也可以是一部分頁面(例如頁頭、頁尾),它也可以是一個RSS頁面,或其他任何類型的頁面。
? ? ? ? ?c)控制器 是模型、視圖以及其他任何處理HTTP請求所必須的資源之間的中介,并生成網頁。
?五、CodeIgniter URL
? ? ? ? ?URL 分段
? ? ? ? ?如果遵循模型-視圖-控制器模式,那么URL中的每一段通常表示下面的含義:
example.com/class/function/ID? ? ? ? ? 1.第一段表示要調用的控制器 類;
? ? ? ? ? 2.第二段表示要調用的類中的函數或方法;
? ? ? ? ? 3.第三段以及后面的段代表傳給控制器的參數,如ID或其他任何變量;
?六、網頁緩存
? ? ? ?可以針對到每個獨立的頁面進行緩存,并且你可以設置每個頁面緩存的更新時間。當頁面第一次加載時,緩存將被寫入到application/cache目錄下的文件中去。之后請求這個頁面時,緩存將被寫入到application/cache目錄下的文件中去。之后請求這個頁面時,就可以直接從緩存文件中讀取內容并輸出到用戶的瀏覽器。如果緩存過期,會在輸出之前被刪除并重新刷新。
? ? ?
? ? ? ? ? ??
總結
以上是生活随笔為你收集整理的阅读“CodeIgniter中国》文档首页》常规主题》安全”之抄录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录”limxml2剖析:功能特性”之摘
- 下一篇: 记录安装php与apache不兼容的过程