事情的經過是這樣的,一個自動化掃描工具說我的程式碼中存在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表單你不會使用。