LINQ筆記:解決HTTP參數污染(HTTP Parameter Pollution)問題

前陣子遇到資安弱點掃描報告掃出參數污染(HTTP Parameter Pollution)問題,大致上就是系統的URL Parameter不可以帶入使用者故意亂輸入的Key與Value,連這種無聊的東西也要變成弱點也是令人著實無言(難道我後段只取我想要的參數犯法嗎?),當然啦,弱點掃描會提出一大堆連環假設理論來說明在這種極端狀況下會導致被攻擊,所以最好的方式就是人家說啥我們改啥,相信我,這是最節省程式設計師寶貴時間的作法。

利用LINQ來解決白名單問題

首先我們要定義系統(頁面)的URL參數白名單,也就是你這個系統中總共會用到哪些參數,接著只要去查詢是否有別的參數被引入,如果有的話就一律踢掉(表示有人惡意汙染),當然啦,如果你要很好心的幫忙「過濾」也是可以,只是我不想。

private System.Collections.Generic.List<string> oParameterWhiteList = new System.Collections.Generic.List<string>() { "myUrl", "superCustomizeUrl" };

public void Page_Load(object Sender, EventArgs e)
{ //忽略大小寫,只要一旦有出現不在白名單裡面的鍵值就一律踢回本頁(洗掉任何參數)
  if (Request.QueryString.AllKeys.Where(x => !oParameterWhiteList.Contains(x, System.StringComparer.CurrentCultureIgnoreCase)).Any())
  { Response.Redirect(Request.CurrentExecutionFilePath); }
}

備註

我要特別再唾棄一下這種不負責任的檢測,因為你永遠無法得知帶入的參數是「非蓄意」還是「蓄意」,而這個問題會引爆後續的問題。不知道大家有沒有在Facebook分享網址的經驗,在這個情況下FB會自動在連結後面加入fbclid這個URL Parameter參數,我不知道在這個社交分享大廠但卻不在白名單的情況下,任意的過濾掉並踢到原始無參數頁面而導致公司營銷損失,你老闆會怎麼處理你了。(弱掃:誰理你😜,關我屁事!)

參考

LINQ筆記:使用LINQ達成NOT IN的效果(黑名單)

弱點掃描 爭議 疑慮 URL參數污染 HttpParameterPollution