事情的經過是這樣的,一個自動化掃描工具說我的代碼中存在XSS漏洞,什么是XSS不懂的朋友可以看這里
我的代碼里面開啟CodeIgniter框架的CSRF Token,如下:
很簡單,更多詳情參考CI官方文檔,主要用法就是在form_open時候自動插入一個隱藏的token值,當然還可以直接用php echo security->csrf_hash來配合其他一些用法,這里不多說。
接下來說說我的代碼,Controller中代碼如下:
視圖層代碼這里頁寫得比較簡單:
代碼中只是生成一個form里面帶有token用於頁面和服務器之間進行交流的。
代碼介紹完了,接下來就來看自動化工具認為存在xss的地方。
自動化工具是通過這兩處來判斷的。因此我們查看form_open的源碼:
可以看到,當form_open函數的action為空的時候,form的action會默認取當前的url。
如果當前的url有“豈不是可以截斷html從而造成xss了,帶着這樣想法,我們來構造一下:
默認是會被ci框架攔截的,因為存在非法字符,這個字符定義是在config.php中:
有些時候url出現中文本攔截也是因為這個配置。
大致運行的流程如下:
index.php
CodeIgniter.php
Router.php
URI.php
URI.php
從上的例子可以看到,如果form_open空參數的可能帶來一定的安全問題,但是默認情況下CI是攔截這些非法字符的,因此不會造成威脅。但是為了安全我們應該養成好的習慣,form_open必須有非空的action參數,就算這個form表單你不會使用。