在古早的時代要取得網址參數時,都會自己寫一段 function 的方式來 Parse 需要解析的 Querystring 值,透過 For 迴圈將帶進來的字串取得 key 與 value 後放到 dictionary 集合中,Code 如下
public static DictionaryQueryParse(string url) { Dictionary qDict = new Dictionary (); foreach (string qPair in url.Substring(url.IndexOf('?') + 1).Split('&')) { string[] qVal = qPair.Split('='); qDict.Add(qVal[0], Uri.UnescapeDataString(qVal[1])); } return qDict; } public static string QueryGet(string url, string param) { var qDict = QueryParse(url); return qDict[param]; }
Utility.ParseQueryString
static void Main(string[] args) { Uri uri = new Uri("http://www.ABC.com/Search.aspx?var1=1&var2=2&var3=Marcus"); // prefix ? string querystring = uri.Query; if (!string.IsNullOrEmpty(querystring) && querystring.Contains("?")) { querystring = querystring.Replace("?", string.Empty); } var nvc = HttpUtility.ParseQueryString(querystring); // 取得全部 GetAllParams(nvc); // 取得單一值 GetParam(nvc, "var1"); Console.ReadKey(); } private static void GetParam(NameValueCollection nvc, string key) { Console.WriteLine("---------------------------"); var result = nvc.Get(key); Console.WriteLine($"Get Single Param is {result}"); } private static void GetAllParams(NameValueCollection nvc) { Console.WriteLine("---------Get All Params---------"); foreach (String s in nvc.AllKeys) { Console.WriteLine($"key[{s}] - value {nvc[s]}"); } }程式說明 :
- Line 7-9 : 處理 Uri Querystring 中的問號邏輯
- Line 12 : 透過 HttpUtility.ParseQueryString 解析 Uri 的 Querystring
- Line 15 : 取得全部參數方法
- Line 17 : 取得單一參數方法
輸出結果如下
透過 Querystring 取得參數值變得更方便了,但更要注意的是安全的議題,使用者傳來的 Request 都具有潛在的安全性威脅,如果盲目地相信使用者的輸入參數帶入資料庫查詢就會造成 SQL Injection,根據 OWASP TOP 10 - 2017 報告提到 Injection 攻擊都是站穩榜首 (如下圖),因此在開發時更應該多加留意
參考
0 意見:
張貼留言