淺談php(codeigniter)安全性注意事項
1、httponly
session一定要用httponly的否則可能被xxs攻擊,利用js獲取cookie的session_id。
要用框架的ci_session,更長的位數(shù),httponly,這些默認(rèn)都配好了。
不要用原生的phpsession,而要用ci_session。ci_session位數(shù)更長。
如果要用原生的session,應(yīng)該這樣設(shè)置(php.ini):
session.sid_length //sid的長度,這里要加長,默認(rèn)的太短了
session.cookie_httponly = 1原生的session就會變成httponly了。
2、phpinfo
一定要關(guān)閉phpinfo頁面,dump的請求信息可能會被攻擊者利用。比如cookie信息。
3、強(qiáng)制全站https
通過cdn跳轉(zhuǎn),本地開發(fā)環(huán)境也要配https。如果有的環(huán)節(jié)不能使用https,比如消息推送,那么可以新建一個站點。
4、Strict mode
session.use_strict_mode = 1
只使用服務(wù)端自己生成的session id,不使用用戶客戶端生成的session id。
5、CSRF跨站請求偽造
A的cookie里有站點example.com的session id,并且未過期,B通過放一個圖片在論壇上,引誘A去點擊這個圖片,這個圖片會發(fā)起一個請求,請求偽裝成example.com,A的瀏覽器信以為真,將example.com的cookie附加到了這個請求上面,這個請求信息被B的代碼截獲并且通過異步請求發(fā)送給了B,B通過這個cookie登錄了A在example.com的賬戶。
CI有防CSRF機(jī)制,即他會在表單里面自動的插入一個隱藏的CSRF字段。需要進(jìn)行如下設(shè)置:
application/config/config.php:
$config['csrf_protection'] = TRUE;
注意,這個開了以后,所有的向外站進(jìn)行的請求都被阻止了。如果我們網(wǎng)站有向其他網(wǎng)站獲取數(shù)據(jù)的行為,比如說調(diào)用api,那就不可以啟用這個開關(guān)。
6、xss攻擊
CI會對post數(shù)據(jù)進(jìn)行xss過濾,只要這樣調(diào)用:
$this->input->post('a',true);
只要加一個參數(shù)true,就可以對post的數(shù)據(jù)進(jìn)行xss過濾。
7、重放
你把用戶名密碼加密了,傳到服務(wù)器進(jìn)行登錄驗證,攻擊者并不需要解密你這些用戶名密碼,他只要把截獲的這些數(shù)據(jù)包,重新再操作一次,就可以實現(xiàn)登錄,這就是重放。
5、6的防御措施:每個表單包含一個隱藏的只能用一次的隨機(jī)碼token。
只用一次的token實現(xiàn):redis 到期失效 使用后直接刪掉
8、總結(jié):用戶安全登錄流程
<1>session基本策略:
(1)session僅作會話session,關(guān)閉瀏覽器即失效;
(2)session的有效期設(shè)置得越短越安全,比如說60秒;
(3)相應(yīng)的需要修改session的刷新時間,比如說30秒;
(4)設(shè)置用redis存儲session。
配置如下:
在php.ini:
session.gc_maxlifetime = 60
這個是session的有效期,默認(rèn)是1440秒,即24分鐘,改為比如說60秒。當(dāng)60秒后,客戶端跟服務(wù)端這個sid對得上的話,也是無效的,應(yīng)該在60秒之前刷新一次頁面更新sid,怎么更新下面有說;
在application/config/config.php:
$config['sess_driver'] = 'redis';//設(shè)為用redis存儲session $config['sess_cookie_name'] = 'ci_session'; $config['sess_expiration'] = 0;//設(shè)為會話session,關(guān)閉瀏覽器,客戶端cookie即失效 $config['sess_save_path'] = 'tcp://127.0.0.1:端口號';//redis地址 $config['sess_match_ip'] = FALSE;//要不要驗證ip是否一致 $config['sess_time_to_update'] = 30;//超30秒即刷新sid $config['sess_regenerate_destroy'] = TRUE;//重新生成sid的時候刪除舊sid
<2>session id的刷新及session的過期時間區(qū)分:
注意:這些設(shè)置跟安全關(guān)系非常大,應(yīng)該注意區(qū)分及使用。
上面說的session.gc_maxlifetime是什么意思?即一個session從產(chǎn)生,到過期不能用的時間。其實如果使用redis就清楚了,這個值就是使用redis保存sid的時候,設(shè)定的一個存續(xù)時間,這就很清楚了,當(dāng)一個sid產(chǎn)生的時候就會把這個時間寫進(jìn)去,那么到了這個時間,這個key-value就會被刪掉。
那么這個sess_time_to_update呢,這個顧名思義是刷新時間,這個時間是一個閾值,是指超過這個時間即刷新。并不是自動刷新,而是訪問session的時候刷新!當(dāng)我們在使用session的時候,他會去判斷上次使用session跟這次使用session的間隔,如果間隔大于這個值,即刷新sid。這個使用,通常的表現(xiàn)就是我們在刷新頁面,需要讀取session以鑒權(quán),那么就是在刷新頁面的時候,兩次間隔有超過這個時間,即刷新sid,那么結(jié)合上面的maxlifetime呢,就是刷新完之后session重新續(xù)命了,一個新的session寫進(jìn)去,連帶一個重新開始的計時。
就是說呢,如果我們一會刷一下頁面一會刷一下頁面,那么必然會在必要的時候觸發(fā)我們的刷新機(jī)制,那么我們的session就不會過期了,永遠(yuǎn)不會,如果經(jīng)常性的在那里刷的話。如果兩次刷新的時間間隔超過maxlifetime呢,這時會顯示登錄超時了,session已經(jīng)沒了,因為在過期了之后你去update,顯然是不行了,update失敗。
那么總結(jié)就是,這個maxlifetime決定了我們兩次刷新之間不能超過多長時間,否則登錄超時;而update呢肯定要小于maxlifetime,這是必然的,因為如果大于就無效了,因為過期了刷新沒用。并且最好我覺得這個update最好是maxlifetime的一半以下。如果maxlifetime很長的話(希望改善用戶體驗,讓用戶老是登錄超時總是不大好),那么這個update設(shè)的比較短也沒關(guān)系,因為設(shè)的比較短的話,假設(shè)這個session被偷了那么有比較大的可能這個賊去使用的時候已經(jīng)過期,安全性會比較高。
<2>one-times-tokens:
一次性的token
參考這個文章:
以上這篇淺談php(codeigniter)安全性注意事項就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
PHP+MySQL+sphinx+scws實現(xiàn)全文檢索功能詳解
這篇文章主要介紹了PHP+MySQL+sphinx+scws實現(xiàn)全文檢索功能,詳細(xì)分析了sphinx、scws的下載安裝、配置、數(shù)據(jù)庫創(chuàng)建及全文檢索功能的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2019-08-08php 網(wǎng)頁播放器用來播放在線視頻的代碼(自動判斷并選擇視頻文件類型)
其實這里的php 視頻播放代碼基本上常見的視頻格式都支持,用正則匹配文件擴(kuò)展名,并根據(jù)文件擴(kuò)展名的不同調(diào)用相應(yīng)的在線播放器代碼。2010-06-06PHP通過插入mysql數(shù)據(jù)來實現(xiàn)多機(jī)互鎖實例
這篇文章主要介紹了PHP通過插入mysql數(shù)據(jù)來實現(xiàn)多機(jī)互鎖的方法,包括了加鎖與釋放鎖的完整實現(xiàn)方法,非常實用,需要的朋友可以參考下2014-11-11php環(huán)境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比較?
什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?在php運行環(huán)境配置中用得到,究竟哪種更適合網(wǎng)站。2011-10-10