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