在古早的時代要取得網址參數時,都會自己寫一段 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 意見:
張貼留言