CodeIgniter中使用CSRF TOKEN的一個坑

HuangJacky發表於2014-08-02

事情的經過是這樣的,一個自動化掃描工具說我的程式碼中存在XSS漏洞,什麼是XSS不懂的朋友可以看這裡

我的程式碼裡面開啟CodeIgniter框架的CSRF Token,如下:

NewImage

很簡單,更多詳情參考CI官方文件,主要用法就是在form_open時候自動插入一個隱藏的token值,當然還可以直接用php echo security->csrf_hash來配合其他一些用法,這裡不多說。

接下來說說我的程式碼,Controller中程式碼如下:

NewImage

檢視層程式碼這裡頁寫得比較簡單:

NewImage

程式碼中只是生成一個form裡面帶有token用於頁面和伺服器之間進行交流的。

程式碼介紹完了,接下來就來看自動化工具認為存在xss的地方。

NewImage

自動化工具是通過這兩處來判斷的。因此我們檢視form_open的原始碼:

NewImage

可以看到,當form_open函式的action為空的時候,form的action會預設取當前的url。

如果當前的url有“豈不是可以截斷html從而造成xss了,帶著這樣想法,我們來構造一下:

NewImage

預設是會被ci框架攔截的,因為存在非法字元,這個字元定義是在config.php中:

NewImage

有些時候url出現中文字攔截也是因為這個配置。

大致執行的流程如下:

NewImage         index.php

NewImage                    CodeIgniter.php

NewImage            Router.php

NewImage            URI.php

NewImage            URI.php

從上的例子可以看到,如果form_open空引數的可能帶來一定的安全問題,但是預設情況下CI是攔截這些非法字元的,因此不會造成威脅。但是為了安全我們應該養成好的習慣,form_open必須有非空的action引數,就算這個form表單你不會使用。

相關文章