php中codeigniter安全性注意事項圖文詳解

來源:互聯網
上載者:User
本篇文章主要介紹php中codeigniter安全性注意事項,感興趣的朋友參考下,希望對大家有所協助。

1、httponly

session一定要用httponly的否則可能被xxs攻擊,利用js擷取cookie的session_id。

要用架構的ci_session,更長的位元,httponly,這些預設都配好了。

不要用原生的phpsession,而要用ci_session。ci_session位元更長。

如果要用原生的session,應該這樣設定(php.ini):

session.sid_length //sid的長度,這裡要加長,預設的太短了

session.cookie_httponly = 1原生的session就會變成httponly了。

2、phpinfo

一定要關閉phpinfo頁面,dump的請求資訊可能會被攻擊者利用。比如cookie資訊。

3、強制全站https

通過cdn跳轉,本地開發環境也要配https。如果有的環節不能使用https,比如訊息推送,那麼可以建立一個網站。

4、Strict mode

session.use_strict_mode = 1

只使用服務端自己產生的session id,不使用使用者用戶端產生的session id。

5、CSRF跨站請求偽造

A的cookie裡有網站example.com的session id,並且未到期,B通過放一個圖片在論壇上,引誘A去點擊這個圖片,這個圖片會發起一個請求,請求偽裝成example.com,A的瀏覽器信以為真,將example.com的cookie附加到了這個請求上面,這個請求資訊被B的代碼截獲並且通過非同步請求發送給了B,B通過這個cookie登入了A在example.com的賬戶。

CI有防CSRF機制,即他會在表單裡面自動的插入一個隱藏的CSRF欄位。需要進行如下設定:

application/config/config.php:

$config['csrf_protection'] = TRUE;


注意,這個開了以後,所有的向外站進行的請求都被阻止了。如果我們網站有向其他網站擷取資料的行為,比如說調用api,那就不可以啟用這個開關。

6、xss攻擊

CI會對post資料進行xss過濾,只要這樣調用:

$this->input->post('a',true);

只要加一個參數true,就可以對post的資料進行xss過濾。

7、重放

你把使用者名稱密碼加密了,傳到伺服器進行登入驗證,攻擊者並不需要解密你這些使用者名稱密碼,他只要把截獲的這些資料包,重新再操作一次,就可以實現登入,這就是重放。

5、6的防禦措施:每個表單包含一個隱藏的只能用一次的隨機碼token。

只用一次的token實現:redis 到期失效 使用後直接刪掉

8、總結:使用者安全登入流程

<1>session基本策略:

(1)session僅作會話session,關閉瀏覽器即失效;

(2)session的有效期間設定得越短越安全,比如說60秒;

(3)相應的需要修改session的重新整理時間,比如說30秒;

(4)設定用redis儲存session。

配置如下:

在php.ini:

session.gc_maxlifetime = 60


這個是session的有效期間,預設是1440秒,即24分鐘,改為比如說60秒。當60秒後,用戶端跟服務端這個sid對得上的話,也是無效的,應該在60秒之前重新整理一次頁面更新sid,怎麼更新下面有說;

在application/config/config.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的到期時間區分:

注意:這些設定跟安全關係非常大,應該注意區分及使用。

上面說的session.gc_maxlifetime是什麼意思?即一個session從產生,到到期不能用的時間。其實如果使用redis就清楚了,這個值就是使用redis儲存sid的時候,設定的一個存續時間,這就很清楚了,當一個sid產生的時候就會把這個時間寫進去,那麼到了這個時間,這個key-value就會被刪掉。

那麼這個sess_time_to_update呢,這個顧名思義是重新整理時間,這個時間是一個閾值,是指超過這個時間即重新整理。並不是自動重新整理,而是訪問session的時候重新整理!當我們在使用session的時候,他會去判斷上次使用session跟這次使用session的間隔,如果間隔大於這個值,即重新整理sid。這個使用,通常的表現就是我們在重新整理頁面,需要讀取session以鑒權,那麼就是在重新整理頁面的時候,兩次間隔有超過這個時間,即重新整理sid,那麼結合上面的maxlifetime呢,就是重新整理完之後session重新續命了,一個新的session寫進去,連帶一個重新開始的計時。

就是說呢,如果我們一會刷一下頁面一會刷一下頁面,那麼必然會在必要的時候觸發我們的重新整理機制,那麼我們的session就不會到期了,永遠不會,如果經常性的在那裡刷的話。如果兩次重新整理的時間間隔超過maxlifetime呢,這時會顯示登入逾時了,session已經沒了,因為在到期了之後你去update,顯然是不行了,update失敗。

那麼總結就是,這個maxlifetime決定了我們兩次重新整理之間不能超過多長時間,否則登入逾時;而update呢肯定要小於maxlifetime,這是必然的,因為如果大於就無效了,因為到期了重新整理沒用。並且最好我覺得這個update最好是maxlifetime的一半以下。如果maxlifetime很長的話(希望改善使用者體驗,讓使用者老是登入逾時總是不大好),那麼這個update設的比較短也沒關係,因為設的比較短的話,假設這個session被偷了那麼有比較大的可能這個賊去使用的時候已經到期,安全性會比較高。

<2>one-times-tokens:

一次性的token

以上就是本文的全部內容,希望對大家的學習有所協助。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.