[.NET] QueryString 的那些事

前言
Querystring是ASP.NET狀態管理(ASP.NET State Management)機制中常用到的傳遞資料方式之一
相信每個ASP.NET開發人員對此都很熟悉,此篇文章是自己對於Querystring資訊,整理給日後的自己看(有些事過30歲後就不一樣了XD)

概述
Querystring(查詢字串)是附加在網頁URL結尾的資訊。主要是在Url上傳遞資料,可能是一個搜尋字串、頁碼、某項特定的指標…或類似的東西
在網址結尾加上一個問號(?)開始,每一組參數都是用「&」區隔開來,是一種KEY / Value的組合。
舉例來說(參考上圖),在Yahoo首頁搜尋引擎輸入「Hello world」後,在按下搜尋按鈕,會導頁到查詢結果頁面,並將符合搜尋字串相關資料呈現出來。
運作原理是透過Querystring作為資料傳遞,當你按下搜尋按鈕時,會將你在首頁(A網頁)輸入的搜尋字串「Hello world」傳遞到查詢結果呈現頁面(B網頁)

前言

Querystring是ASP.NET狀態管理(ASP.NET State Management)機制中常用到的傳遞資料方式之一

相信每個ASP.NET開發人員對此都很熟悉,此篇文章是自己對於Querystring資訊,整理給日後的自己看

有些事過30歲後就不一樣了XD

 

概述

Querystring(查詢字串)是附加在網頁URL結尾的資訊。主要是在Url上傳遞資料

可能是一個搜尋字串、頁碼、某項特定的指標…或類似的東西

在網址結尾加上一個問號(?)開始,每一組參數都是用「&」區隔開來,是一種KEY / Value的組合。

image

舉例來說(參考上圖),在Yahoo首頁搜尋引擎輸入「Hello world」後,在按下搜尋按鈕

會導頁到查詢結果頁面,並將符合搜尋字串相關資料呈現出來。

運作原理是透過Querystring作為資料傳遞,當你按下搜尋按鈕時,會將你在首頁(A網頁)輸入的搜尋字串「Hello world」傳遞到查詢結果呈現頁面(B網頁)

 

 

使用方式

取得Querystrnig參數內容方式:

  • C#:使用起來相當方便,可以用Requert.Querystring或是Request.Url.Query取得對應的值(註一)
// 設定
Response.Redirect("Default.aspx?參數名稱=" + 參數值)
Server.Transfer("Default.aspx?參數名稱=" + 參數值)

// 取得
// 指定特定key
string q = Request.QueryString["參數名稱"];
Response.Write(q);

// 取得集合
NameValueCollection nvc = Request.QueryString; 
foreach (string key in nvc.Keys)
{
    Response.Write("{0} => {1}", key, nvc[key]);
}
  • Client端:可以用Javascript寫一長串判斷來達到目的,在此建議可以用jQuery外掛(Query String Object)處理比較方便偷懶
/*使用jQuery外掛:jQuery String Object*/
// 設定
var newUrl = $.query.set("參數名稱", 參數值).toString();     

// 取得
var str = $.query.get('參數名稱');

註一:使用Request.QueryString會改變編碼,為確保接收參數不受影響,可以使用Request.Url.Query取得尚未解碼的原始字串,在進行解碼。

 

 

URL編碼

在URL網路標準規範中有規定,URL網址只能用英文字母和數字[0-9a-zA-Z]、一些特殊符號及特定保留字,才可以不經過編碼直接用在URL(註二)這意謂URL中如果有中文字的話,就必須經過編碼後使用。(註三)

在程式開發時,瀏覽器如果要在Querystring中帶有中文字或是特殊字元資料時,可以透過以下進行編碼&解碼

  • .Net Framework:
// 使用Server.UrlEncode進行編碼
String myURL = "http://www.ABC.com/Search.aspx?q=" + Server.UrlEncode("你好嗎");
Response.Write("<a href=" + myURL + "> 你好嗎 </a>");

// 使用Server.UrlDecode進行解碼
String myDecodedString = Server.UrlDecode(URI);
Response.Write("Decoded:" + myDecodedString );
  • Javascript:
// URL編碼:encodeURI():以UTF-8輸出,在每個字前面加上%
url = url + "?q=" + encodeURI("你好嗎");

// URL解碼:decodeURI()
document.write(encodeURI(URI)

在網路規範中沒有規定具體的編碼方法,瀏覽器本身可以自行設定,導致URL編碼有點混亂,開發上必須要更加小心

有關URL編碼的細節,我推薦大家可以參考「关于URL编码」,這篇文章中有詳細的介紹(我看完才比較瞭解,遮臉 XD)

 

註二:RFC 1783:"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."

註三:在google輸入「你好嗎」三個字時,按下搜尋之後,搜尋結果頁面網址呈現的查詢字串會是UTF-8編碼後「%E4%BD%A0%E5%A5%BD%E5%97%8E」

 

 

安全性

Querystring在使用上很方便,但以安全性考量來說,是有淺在安全性風險滴

因為可透過瀏覽器看到網址內容,清楚可見查詢的資訊,且使用者可任意修改

使用時有幾點建議(網路是很危險滴,大人們請多多留意阿)

  • 驗證資料:不要輕易相信從Client傳來的URL網址,對於Querystring的參數值是要經過驗證。有心的駭客要竊取網站資料,會將攻擊指令組成一長字串Querystring,進行SQL Inject攻擊(註四)
  • 敏感性資料:因為淺而易見,不要放置敏感性資料在Querystring
  • 長度限制:一些瀏覽器對於Querystring有長度限制,超過預設長度字元時,Querystring會被截斷,詳細可以參考ASP.NET 4.0 設定QueryString的最大長度

註四:SQL Inject可以參考黑暗大文章寫的游擊式的SQL Injection攻擊

 

 

其他議題

在查資料驗證自己的想法中,有查到很多相關Querystring的議題,在此先列出來,方便日後自己研究

[C#]用Base64編碼QueryStringQuerystring使用Base64加密法進行URL編碼

簡易的URL Rewriting隱藏Querystring:使用Url Rewrite 將Querystring隱藏起來

剔除特定QueryString參數:說明如何移除特定的Qquerystring參數

具有潛在危險 Request.QueryString 的值:延伸閱讀多想兩分鐘,你可以不用 validateRequest="false"

QueryString的中文編碼問題

 

 

番外篇 - ASP.NET各種狀態比較表

在查資料的過程中,很幸運的找到一張圖說明ASP.NET的各種狀態(ASP.NET State Management)比較表

透過這張圖表,可以更詳細的瞭解各狀態之間的關係比較(圖表來源 Bubblog,如有侵權或是不妥請告知)

aspnetstate

 

參考

此篇文章是上網查詢自己整理的結果,如果內容有錯誤的地方,麻煩各位高手給予小弟指導

如果覺得此篇文章不錯,請幫忙點選「我要推薦」;讓我有持續努力的動力,謝謝

ASP.NET 狀態管理建議事項

关于URL编码

[HTTP]Http GET、POST Method

HttpUtility.ParseQueryString

Querystring查詢

[ASP.NET] State Management – Summary