客戶用checkmarx對php的專案做源碼掃描,出現大量Reflected XSS All Clients的風險
修改後還是過不了
原始的寫法
$name=substr(trim($_GET["name"]),0,15);
...
<span><?=$name?></span>
修改後的寫法
$name=htmlspecialchars(substr(trim($_GET["name"]),0,15),ENT_QUOTES);
...
<span><?=$name?></span>
$name這個變數中間沒在變動過
htmlspecialchars也加上ENT_QUOTES了
有人用過這一套嗎?
感謝!
就小弟的認知,php內建的htmlspecialchars()就是用來解決xss的
(雖然沒有到完美防堵)
小弟的問題點在於怎樣的寫法才是checkmarx能接受的方式?
1.php的htmlspecialchars()
2.自己刻正規表示法,用取代字串的方式過濾
3.自己刻正規表示法,踢走不合法的輸入
...
不同的源碼掃描工具,認定的標準會有不同(還有誤判的可能)
最差的狀況就只能一直改寫法,送測到客戶抓狂為止
的確有誤判,代理商自己都承認了,還緊急更版.
我們自己追了它掃出來的 XSS 風險, 發現程式碼 Call Stack根本不是它系統說的那樣. 寫了篇報告、並把追code的過程錄影, Call 原廠後才承認有 bug.
我們的客戶軍方體系和金融機構都有用他們家的...
我發現只要在$_GET/$_POST後、輸出前(echo 或 $output) 用PHP 的過濾function filter_var_array or filter_input_array就不會被掃出來。
但是如果你把它寫在你自己的 function 內, 它就可能會被忽視, 認為你的參數沒有消毒過.
而且只要你的物件方法命名一樣, 就有可能被誤判; 例如: $enrol->test_settings(); 它會導向到另一個 物件的 base_class::test_settings 去, 整個超傻眼 ><
被它們搞了半年多, 為了讓checkmarx掃到零風險, 搞的framework的架構大亂, 還掃不過; 都想要放棄了.
還好客戶要換另一套了.