حتما شما هم در بخی از url ها علامت سوال (؟) را دیده اید که در ادامه آن کاراکترهایی قرار گرفته اند. به این رشته کاراکتر query string گفته می شود. در این مقاله می خوانید که query string چیست و چه معایبی دارد.
query string چیست؟
برای انتقال اطلاعات بین صفحات asp.net چندین انتخاب وجود دارد که یکی از این راه ها استفاده از Query String و آبجکت Request است. زمانی که شما در حال گذر در اینترنت هستید ممکن است با صفحات عجیبی مثل:
http://www.localhost.com/Webform2.aspx?name=Sajad&lastName=Bakhtyari
مواجه شوید. این آدرس های Html از Query String برای انتقال اطلاعات بین صفحات استفاده میکند.
کوئری استرینگ در واقع یکی از روشهای انتقال متغیرها و داده از یک صفحه به صفحه دیگر است. Query String عموما در صفحات وب که نیاز به انتقال اطلاعات از یک صفحه به صفحه ی دیگر است، استفاده می شود. به طور مثال شما در صفحه اول اطلاعاتی مانند نام و نام خانوادگی را از بینندگان وب سایت خود دریافت می کنید و در صفحه ی بعد مشتری را با نام خودش مورد خطاب قرار می دهید.
کوئری استرینگ تشکیل شده است از هر مقداری که بعد از علامت سوال (“?”) در انتهای URL قرار میگیرد که می تواند شامل یک یا چند پارامتر باشد.
برای کسب اطلاعات در حوزه ی asp.net چیست به شما پیشنهاد می شود مقاله ما را مطالعه نمایید.
ساختار query string در asp.net
به طور مثال در آدرس مذکو شما ۳نوع داده را ارسال می کنید:
http://www.localhost.com/Webform2.aspx?name=Sajad&lastName=Bakhtyari
- Webform2.aspx : این صفحه ای است که به آن انتقال خواهید یافت.
- name=Sajad : این قسمت مقدار متغییر name را ارسال میکند.
lastName=Bakhtyar
: این مقدار متغییر lastName را ارسال میکند.
همانطور که متوجه شدید در داخل یک Query String از & برای جدا سازی متغییر ها استفاده می شود. ساخت یک Query در Asp.Net بسیار ساده است، به طور مثال پروژه ای ایجاد کنید که دارای ۲ فرم باشد و در فرم اول ۲ عدد Text Box و یک Button قرار دهید. سپس در رویداد Click آن کد زیر را قرار دهید.
private void btnSubmit_Click(object sender, System.EventArgs e) { Response.Redirect(“Webform2.aspx?Name=” + this.txtName.Text + “&LastName=” + this.txtLastName.Text); }
قسمت اول این کد یک query می سازد و محتویات TextBox ها را به فرم دوم ارسال میکند. حال برای دریافت اطلاعات ارسال شده در فرم دوم باید کد زیر را در قسمت page_load قرار دهید.
private void Page_Load(object sender, System.EventArgs e) { this.txtBox1.Text = Request.QueryString["Name"]; this.txtBox2.Text = Request.QueryString["LastName"]; }
Request.QueryString در اینجا از یکی از راه ای موجود مقدار دهی شده است. شما میتوانید از روش های مختلفی محتویات Querystring را بازیابی کنید. مثلا:
private void Page_Load(object sender,
System.EventArgs e) { this.txtBox1.Text = Request.QueryString[0]; this.txtBox2.Text = Request.QueryString[1]; }
راه دیگر بازیابی محتویات Querystring بدون نام بردن تک تک متغیر ها استفاده از حلقه ها است، مانند:
foreach( string s in Request.QueryString) { Response.Write(Request.QueryString[s]); } ویا for (int i =0;i < Request.QueryString.Count;i++) { Response.Write(Request.QueryString[i]); }
معایب Query
- Query ها محدودیت طول دارند، در صورتی که اطلاعات زیادی را از این طریق بخواهیم ارسال کنیم با مشکل مواجه میشویم.
- رشته ی Query قابل مشاهده در Address Bar مرورگر ها است، به همین دلیل نمیتوان از انتقال اطلاعات مهم از این طریق اقدام کرد.
- Query نمیتواند کاراکتر های & و فاصله را انتقال دهد.
به طور مثال اگر شما از کد زیر استفاده کنید، متوجه خواهید شد که در انتقال کاراکتر های فاصله و & دچار مشکل است. برای حل این مشکل باید در متن به جای استفاده از کاراکتر فاصله باید از ۲۰% استفاده و به جای استفاده از & باید از ۲۶% استفاده کرد. به طور مثال شما میتوانید کد زیر را به جای کد موجود در button خود قرار دهید.
private void btnSubmit_Click(object sender, System.EventArgs e) { string p1 = this.txtName.Text.Replace("&","%26"); p1 = this.txtName.Text.Replace(" ","%20"); string p2 = this.txtLastName.Text.Replace("&","%26"); p2 = this.txtName.Text.Replace(" ","%20"); "WebForm2.aspx?" + "Name=" + p1 + "&LastName=" + p2; Response.Redirect(p2); }
حال برای اینکه دیگر نیازی به جایگزینی کاراکتر های فاصله و & با ۲۰% و ۲۶% نباشد میتوانید از متد Server.UrlEncode. Server.UrlEncode استفاده نمایید تا Query string شما را encode کرده و دیگر به مشکل برخورد نکنید.
کد زیر بیانگر این موضوع است.
private void btnSubmit_Click(object sender, System.EventArgs e) { Response.Redirect("WebForm2.aspx?" + "Name=" + Server.UrlEncode(this.txtName.Text) + "&LastName=" + Server.UrlEncode(this.txtLastName.Text)); }
نکات امنیتی در استفاده از Query String
اگرچه استفاده از Query String روشی ساده و سریع برای انتقال داده بین صفحات وب است، اما باید به نکات امنیتی آن توجه ویژهای داشت. چون اطلاعات ارسالی در Query String به صورت واضح در URL نمایش داده میشوند، این اطلاعات در دسترس کاربران، تاریخچه مرورگر و حتی سرویسهای میانی قرار دارند. بنابراین نباید اطلاعات حساس مانند رمز عبور، شماره کارت بانکی یا دادههای خصوصی را از این طریق ارسال کرد.
همچنین، Query String میتواند هدف حملات تزریق (Injection) و Cross-Site Scripting (XSS) قرار گیرد. به همین دلیل، همیشه باید دادههای دریافت شده از Query String را قبل از استفاده، با استفاده از متدهای مناسب اعتبارسنجی و فیلتر کنید.
جایگزینهای مناسب برای انتقال اطلاعات
اگر دادههای ارسالی حساس یا حجیم هستند، بهتر است از روشهای دیگری به جای Query String استفاده شود، مانند:
استفاده از Session: دادهها در سمت سرور ذخیره میشوند و نیازی به نمایش در URL نیست.
ارسال اطلاعات به روش POST: دادهها در بدنه درخواست ارسال میشوند و در URL ظاهر نمیشوند.
استفاده از کوکیها (Cookies): برای ذخیرهسازی دادههای موقت یا پایدار در مرورگر کاربران.
هر کدام از این روشها مزایا و محدودیتهای خود را دارند که باید با توجه به نوع پروژه و نیاز کاربران انتخاب شوند.
نتیجه گیری
Query String ابزاری کاربردی برای انتقال اطلاعات ساده و غیر حساس بین صفحات وب است که در توسعه وب به ویژه در ASP.NET بسیار مورد استفاده قرار میگیرد. اما محدودیتهای طول، نمایش داده شدن اطلاعات در URL و مشکلات امنیتی آن را باید در نظر گرفت. با استفاده از روشهایی مانند Server.UrlEncode میتوان از مشکلات مربوط به کاراکترهای خاص جلوگیری کرد. همچنین، برای اطلاعات حساس یا حجیم بهتر است از روشهای امنتر و مناسبتری بهره گرفت تا هم امنیت دادهها حفظ شود و هم تجربه کاربری بهتری فراهم گردد.