只有累積,沒有奇蹟

2019年1月12日 星期六

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

說明
在古早的時代要取得網址參數時都會自己寫一段 function 的方式來 Parse 需要解析的 Querystring 值,透過 For 迴圈將帶進來的字串取得 key 與 value 後放到 dictionary 集合中Code 如下
  1. public static Dictionary QueryParse(string url)
  2. {
  3. Dictionary qDict = new Dictionary();
  4. foreach (string qPair in url.Substring(url.IndexOf('?') + 1).Split('&'))
  5. {
  6. string[] qVal = qPair.Split('=');
  7. qDict.Add(qVal[0], Uri.UnescapeDataString(qVal[1]));
  8. }
  9. return qDict;
  10. }
  11. public static string QueryGet(string url, string param)
  12. {
  13. var qDict = QueryParse(url);
  14. return qDict[param];
  15. }

Utility.ParseQueryString
回到主題來發現 .Net Framework 在 System.Web 底下有提供 HttpUtility.ParseQueryString API 解決自己硬幹的苦惱,可以將要解析的 Querystring 值作為參數給此方法後會回傳 NameValueCollection,且提供多載方法可以指定編碼方式 (預設是 UTF8)Sample Code 如下
  1. static void Main(string[] args)
  2. {
  3. Uri uri = new Uri("http://www.ABC.com/Search.aspx?var1=1&var2=2&var3=Marcus");
  4.  
  5. // prefix ?
  6. string querystring = uri.Query;
  7. if (!string.IsNullOrEmpty(querystring) && querystring.Contains("?"))
  8. {
  9. querystring = querystring.Replace("?", string.Empty);
  10. }
  11.  
  12. var nvc = HttpUtility.ParseQueryString(querystring);
  13. // 取得全部
  14. GetAllParams(nvc);
  15.  
  16. // 取得單一值
  17. GetParam(nvc, "var1");
  18.  
  19. Console.ReadKey();
  20. }
  21.  
  22. private static void GetParam(NameValueCollection nvc, string key)
  23. {
  24. Console.WriteLine("---------------------------");
  25.  
  26. var result = nvc.Get(key);
  27.  
  28. Console.WriteLine($"Get Single Param is {result}");
  29. }
  30.  
  31. private static void GetAllParams(NameValueCollection nvc)
  32. {
  33. Console.WriteLine("---------Get All Params---------");
  34. foreach (String s in nvc.AllKeys)
  35. {
  36. Console.WriteLine($"key[{s}] - value {nvc[s]}");
  37. }
  38. }
程式說明 : 
  • Line 7-9 : 處理 Uri Querystring 中的問號邏輯
  • Line 12 : 透過 HttpUtility.ParseQueryString 解析 Uri 的 Querystring
  • Line 15 : 取得全部參數方法 
  • Line 17 : 取得單一參數方法
輸出結果如下

安全議題
透過 Querystring 取得參數值變得更方便了,但更要注意的是安全的議題,使用者傳來的 Request 都具有潛在的安全性威脅,如果盲目地相信使用者的輸入參數帶入資料庫查詢就會造成 SQL Injection,根據 OWASP TOP 10 - 2017 報告提到 Injection 攻擊都是站穩榜首 (如下圖),因此在開發時更應該多加留意

參考

Related Posts:

  • [C#] 在 C# 使用 HMAC - SHA256 加密前言 最近工作上跟第三方服務串接時用到 HMAC - SHA256 加密方式,過去大多是使用 MD5 或是 SHA-256 加密但 HMAC 沒接觸過小研究了一番,HMAC 全名是 Hash-based message authentication code,是一種金鑰式雜湊演算法,可以結合加密金鑰 (key) 進行加密最後輸出 64 字元的內容,對於演算法內容想了解更多可以參考 wiki : 傳送門,這裡就紀錄在 C# 中如… Read More
  • [NETCore] 使用 Try.NET 建立互動文件 前言 Try.NET 是微軟公布的 open source 互動式文件產生器,可以在網頁上嵌入 .NET 代碼 (目前僅支援 C# 語法),讓閱讀的開發者可以直接在瀏覽器閱讀代碼時直接執行或編輯,也有整合 GitHub Gists 等工具,這篇簡單介紹關於 Try.NET 的介紹與基本應用,若有問題或是錯誤的地方歡迎網路的高手大大給予指導。 Try.NET Online Try.NET 目前線上版在可以在 MSDN 的 執行您的第一個… Read More
  • [VisualStudio] Visual Studio Code 實用套件 - REST Client 前言 有 API 開發經驗的人相信都使用過 Postman 來模擬使用端發出的 Request 進行測試,今天要介紹另一套工具與 Postman 相似 - REST CLIENT,根據官網的敘述如下 REST Client allows you to send HTTP request and view the response in Visual Studio Code directly. Rest Client 套件讓開發者可以在… Read More
  • [WEBAPI] 如何設定 Swagger 為預設首頁 Start Page問題 自己不管是在開發 .NET Framework 或是 .NET Core 專案,只要遇到是 Web API 專案都會安裝 Swagger 來協助測試 API 的動作,只要使用過 Swagger 的開發者都知道啟動專案後第一件事就是要在開啟的頁面網址加上 Swagger,接著在繼續透過 Swagger 頁面進行 API 測試的動作,但每次開啟時就需要在網址上輸入一次也是頗麻煩的,今天就來分享兩種方式可以起始頁面為 swagger 頁面,若有問… Read More
  • [NET] 檢查字串是否為 Json 格式前言 在開發時很常使用到 Json 格式作為設定檔,舉例來說在 ASP.NET Core 設定檔預設也是使用 Json 格式,系統開發中也會將一些常用的設定放在 Json 方便調整,在 ASP.NET 讀取 Json 最常用到的是 Json.Net 套件,使用上可以很方便地將字串轉為定義的類別內容,這篇就來分享怎麼用 Json.net 來判斷要轉換的文字字串是否為 Json 格式,若有問題歡迎留言一起討論。 代碼 首先先下載 Json.Ne… Read More

0 意見:

張貼留言

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

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com