我在新聞列表頁面做了一個搜尋關鍵字功能,POST 送出後,頁面會重新整理,
並且在原本的網址後面增加 "?q=keyword" 類似這樣的網址參數。
為了點進查看詳細內容後,回到列表頁面能保持搜尋條件狀態,
(或點上下頁、分頁,維持搜尋條件的狀態)
我會利用 $(location).attr("search") 把網址參數 "?q=keyword"
填入分頁按鈕的屬性 "href"
比如這樣,產出分頁流水序按鈕
$("#pagelist")[0].innerHTML = $("#pagelist").html() + "<a href='" + $(location).attr("pathname") + $(location).attr("search") + "'>Page N</a>";
因為直接取用 $(location).attr("search") 可能有風險,
所以我另外做了一個 url_replace() 把敏感符號去掉("、'、>、<、(、)以及字串"script"都清會清除掉),
$("#pagelist")[0].innerHTML = $("#pagelist").html() + "<a href='" + url_replace($(location).attr("pathname")) + url_replace($(location).attr("search")) + "'>Page N</a>";
我的理解是這樣:
首先 $(location).attr("search") 取出的字串預設就是 encode
比如我查詢雙引號 ",那取得的值會是 %22,不會是雙引號,
所以理論上不可能利用 雙引號 " 或 單引號 ' 阻斷/創造出新的 HTML 節點/元素
更何況我會先把 " ' < > ( )這些符號清除過濾掉。
再來,我是取完整的 $(location).attr("search")
前面一定會有 "?"
這樣即是網址參數含有惡意指令碼,最前頭也都是有一個"?"
這樣還是會有特殊的腳本指令可以造成 XSS 嗎?
Checkmarx 的建議是使用第三方套件 ESAPI4JS 把 location 參數重新編碼,
但是我去看 https://github.com/ESAPI/owasp-esapi-js
官方已經聲明棄用了 DEPRECATED - OWASP Enterprise Security API for JavaScript (ESAPI-JS)
我應該繼續照 Checkmarx 的建議去使用 ESAPI4JS
還是應該怎麼做才能正確地通過 Checkmarx 針對 javascript 取用 location 相關參數所列報的 XSS 風險?
補充一下:
我有使用 OWASP ZAP 掃過,我上述的做法是沒有 XSS 風險的。
也嘗試過以下功能腳本,也沒有產生 XSS 效果:
https://www.vulnerability-lab.com/resources/documents/531.txt
一個 XSS 遊戲網站,裡面的手法也是無效
https://xss.pwnfunction.com/
這個也是 XSS 腳本範例網站(這個還滿齊全的,還會依照瀏覽器分類)
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
但是最終 Checkmarx 還是列了 XSS 風險,說你使用了 location 會被社交手法攻擊ooxx...
有不使用第三方套件的解法嗎?懇請賜教!