只有累積,沒有奇蹟

2019年1月12日 星期六

[.NET] 使用 ParseQueryString 取得網址參數

說明
在古早的時代要取得網址參數時都會自己寫一段 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
回到主題來發現 .Net Framework 在 System.Web 底下有提供 HttpUtility.ParseQueryString API 解決自己硬幹的苦惱,可以將要解析的 Querystring 值作為參數給此方法後會回傳 NameValueCollection,且提供多載方法可以指定編碼方式 (預設是 UTF8)Sample Code 如下
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 意見:

張貼留言

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com