在古早的時代要取得網址參數時,都會自己寫一段 function 的方式來 Parse 需要解析的 Querystring 值,透過 For 迴圈將帶進來的字串取得 key 與 value 後放到 dictionary 集合中,Code 如下
- public static Dictionary
QueryParse(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 意見:
張貼留言