《PHP學習:淺談php(codeigniter)安全性注意事項》要點:
本文介紹了PHP學習:淺談php(codeigniter)安全性注意事項,希望對您有用。如果有疑問,可以聯系我們。
1、httponlyPHP教程
session一定要用httponly的否則可能被xxs攻擊,利用js獲取cookie的session_id.PHP教程
要用框架的ci_session,更長的位數,httponly,這些默認都配好了.PHP教程
不要用原生的phpsession,而要用ci_session.ci_session位數更長.PHP教程
如果要用原生的session,應該這樣設置(php.ini):PHP教程
session.sid_length //sid的長度,這里要加長,默認的太短了PHP教程
session.cookie_httponly = 1原生的session就會變成httponly了.PHP教程
2、phpinfoPHP教程
一定要關閉phpinfo頁面,dump的請求信息可能會被攻擊者利用.比如cookie信息.PHP教程
3、強制全站httpsPHP教程
通過cdn跳轉,本地開發環境也要配https.如果有的環節不能使用https,比如消息推送,那么可以新建一個站點.PHP教程
4、Strict modePHP教程
session.use_strict_mode = 1
PHP教程
只使用服務端自己生成的session id,不使用用戶客戶端生成的session id.PHP教程
5、CSRF跨站請求偽造PHP教程
A的cookie里有站點example.com的session id,并且未過期,B通過放一個圖片在論壇上,引誘A去點擊這個圖片,這個圖片會發起一個請求,請求偽裝成example.com,A的瀏覽器信以為真,將example.com的cookie附加到了這個請求上面,這個請求信息被B的代碼截獲并且通過異步請求發送給了B,B通過這個cookie登錄了A在example.com的賬戶.PHP教程
CI有防CSRF機制,即他會在表單里面自動的插入一個隱藏的CSRF字段.需要進行如下設置:PHP教程
application/config/config.php:PHP教程
$config['csrf_protection'] = TRUE;
注意,這個開了以后,所有的向外站進行的請求都被阻止了.如果我們網站有向其他網站獲取數據的行為,比如說調用api,那就不可以啟用這個開關.PHP教程
6、xss攻擊PHP教程
CI會對post數據進行xss過濾,只要這樣調用:PHP教程
$this->input->post('a',true);
只要加一個參數true,就可以對post的數據進行xss過濾.PHP教程
7、重放PHP教程
你把用戶名密碼加密了,傳到服務器進行登錄驗證,攻擊者并不需要解密你這些用戶名密碼,他只要把截獲的這些數據包,重新再操作一次,就可以實現登錄,這就是重放.PHP教程
5、6的防御措施:每個表單包含一個隱藏的只能用一次的隨機碼token.PHP教程
只用一次的token實現:redis 到期失效 使用后直接刪掉PHP教程
8、總結:用戶安全登錄流程PHP教程
<1>session基本策略:PHP教程
(1)session僅作會話session,關閉瀏覽器即失效;PHP教程
(2)session的有效期設置得越短越安全,比如說60秒;PHP教程
(3)相應的需要修改session的刷新時間,比如說30秒;PHP教程
(4)設置用redis存儲session.PHP教程
配置如下:PHP教程
在php.ini:PHP教程
session.gc_maxlifetime = 60
這個是session的有效期,默認是1440秒,即24分鐘,改為比如說60秒.當60秒后,客戶端跟服務端這個sid對得上的話,也是無效的,應該在60秒之前刷新一次頁面更新sid,怎么更新下面有說;
PHP教程
在application/config/config.php:PHP教程
$config['sess_driver'] = 'redis';//設為用redis存儲session $config['sess_cookie_name'] = 'ci_session'; $config['sess_expiration'] = 0;//設為會話session,關閉瀏覽器,客戶端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的過期時間區分:PHP教程
注意:這些設置跟安全關系非常大,應該注意區分及使用.PHP教程
上面說的session.gc_maxlifetime是什么意思?即一個session從產生,到過期不能用的時間.其實如果使用redis就清楚了,這個值就是使用redis保存sid的時候,設定的一個存續時間,這就很清楚了,當一個sid產生的時候就會把這個時間寫進去,那么到了這個時間,這個key-value就會被刪掉.PHP教程
那么這個sess_time_to_update呢,這個顧名思義是刷新時間,這個時間是一個閾值,是指超過這個時間即刷新.并不是自動刷新,而是訪問session的時候刷新!當我們在使用session的時候,他會去判斷上次使用session跟這次使用session的間隔,如果間隔大于這個值,即刷新sid.這個使用,通常的表現就是我們在刷新頁面,需要讀取session以鑒權,那么就是在刷新頁面的時候,兩次間隔有超過這個時間,即刷新sid,那么結合上面的maxlifetime呢,就是刷新完之后session重新續命了,一個新的session寫進去,連帶一個重新開始的計時.PHP教程
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/994.html