PDA

View Full Version : آموزش: رشته تقاضا یا QueryString چیست ؟



Peyman.Gh
پنج شنبه 06 خرداد 1389, 01:01 صبح
http://barnamenevis.org/forum/images/icons/icon1.gif یکی از روش های انتقال اطلاعات بین صفحات استفاده از رشته تقاضا میباشد.
در مقایسه با سایر روش ها (مانند Session ) عدم نیاز به منابع سیستم یکی از مزیت های این روش میباشد (فشار کمتر بر روی Server )
اکثر مرورگر ها از این روش پشتیبانی میکنند اما رشته تقاضا محدودیت کاراکتر دارد به این معناست که نمیتوان اطلاعات زیادی را انتقال داد یکی دیگر از معایب این روش امنیت پایین آن میباشد به این علت که کاربر میتواند رشته تقاضا را تغییر دهد.
نمونه ای از رشته تقاضا : Default.aspx?ID=1

نحوه ساخت رشته تقاضا:

بطور مثال یک رشته تعریف میکینم و مقدار آن را برابر با نام صفحه مورد نظر برای انتقال اطلاعات به آن قرار میدهیم.string querystring = "default.aspx";
بعد از نام صفحه باید علامت ? اضافه شود.در ساخت یک رشته تقاضا حداقل به یک پارامتر نیاز است.پارامتر اول بعد از علامت ? قرار میگیرد.به رشته ایجاد شده پارامتر Name را اضافه میکنیم و مقدار آن را بطور مثال برابر Test قرار میدهیم.querystring += "?Name=Test";

برای ارسال رشته تقاضا از Response.Redirect استفاده میشود.
Response.Redirect(querystring);

نحوه بازیابی رشته تقاضا :

برای بازیابی رشته تقاضا از دستور Request.QueryString در صفحه ای که رشته تقاضا به آن ارسال شده است استفاده میشود.
برای مثال : Response.Write(Request.QueryString["Name"]);

نکته:برای ارسال بیش از یک پارامتر بعد از مقدار هر پارامتر & اضافه میکینم و پارامتر دیگر را با مقدار مشخص اضافه میکنیم.
string querystring = "default.aspx";
querystring += "?Name=Test";
querystring += "&ID=1";
Response.Redirect(querystring);

بطور مثال برای بازیابی به صورت زیر عمل خواهیم کرد: Response.Write(Request.QueryString["Name"]+"<br>"+Request.QueryString["ID"]);

موفق باشید.

Mostafa_Dindar
پنج شنبه 06 خرداد 1389, 04:19 صبح
سلام ،

در تكميل گفته هاي دوست خوبمون چند تا نكته رو هم من اضافه ميكنم :

1- در صفحه مقصد هميشه قبل از استفاده از مقدار QueryString برسي كنيد كه مقدار داشته باشد ( اين كار نه تنها در اين مورد ، بلكه هميشه منطقي هست )

2- همانطور كه ملاحظه ميفرمائيد مقادير QueryString به صورت جفت هاي Key-Value ارسال ميشوند در صورتي كه Key چندكلمه اي باشد (مثلا First Name) در Address Bar به جاي Space مقدار 20% قرار خواهد گرفت .همچنين در صورتي كه در Value كاراكتري مثل & داشته باشيم به مشكل برخواهيم خورد .

براي رفع اين مشكل از متد Server.UrlEncode استفاده كنيد و Value را به اون پاس بديد .


3- موارد بسيار پيش خواهد آمد كه دوست نداريد كاربران با تغير Value در Address Bar به صفحات ديگر دسترسي داشته باشند . در اين صورت ميتونيد به شيوه ارائه شده در اين مقاله (http://nayyeri.net/how-to-encrypt-query-string-parameters-in-asp-net) اون رو encript كنيد .

4- البته توجه داشته باشيد كه توصيه شده از Query String براي ارسال اطلاعات مهم و حياتي استفاده نكنيد . چرا ؟ چون Query String داخل Request Header قرار ميگيرد و قابليت دستكاري توسط خرابكارها وجود دارد و توصيه شده كه داده هاي ورودي كاربر يا Header Data ها رو Encode كنيد كه يكي از اونها Server.HTMLEncode (http://msdn.microsoft.com/en-us/library/ms525347%28v=VS.90%29.aspx) هست .

همچنين ميتونيد به شيوه اشاره شده در اين مقاله (http://msdn.microsoft.com/en-us/library/ms525361%28v=VS.90%29.aspx) با Validate كردن از حمله ها جلوگيري كنيد.

سربلند باشيد

اوبالیت به بو
پنج شنبه 06 خرداد 1389, 14:05 عصر
1- در صفحه مقصد هميشه قبل از استفاده از مقدار QueryString برسي كنيد كه مقدار داشته باشد ( اين كار نه تنها در اين مورد ، بلكه هميشه منطقي هست )
اینجوری؟

if (Request.QueryString["ID"] != null)

Peyman.Gh
پنج شنبه 06 خرداد 1389, 14:12 عصر
اینجوری؟

if (Request.QueryString["ID"] != null)

و هچنین
if (Request.QueryString["ID"]!= "")

Mostafa_Dindar
پنج شنبه 06 خرداد 1389, 14:40 عصر
اینجوری؟

if (Request.QueryString["ID"] != null)

بله ، شما ميتونيد در رويداد لود صفحه چك كنيد ، ميتونيد كدي مثل زير بنويسيد :

int id = -1;
if (Request.QueryString["id"] != null) {
try
{
id = int.Parse(Request.QueryString["id"]);
}
catch
{
// Handle it
}
}
DoSomething(id);

ولي همانطور كه ميبينيد كار خسته كننده اي هست ، ميتونيد از يك متد Helper كمك بگيريد :

public static int QueryString(string paramName, int defaultValue)
{
int value;
if (!int.TryParse(Request.QueryString[paramName], out value))
return defaultValue;
return value;
}


و به صورت زير فراخواني كنيد :

int id = QueryString("id", 0);

اگر هم كه از دات نت 3.5 به بالا استفاده ميكنيد يك Extension Method بنويسيد و خودتون رو راحت كنيد

هميشه شاد باشيد ( اين يك دستور است:لبخند: )

Mostafa_Dindar
پنج شنبه 06 خرداد 1389, 14:56 عصر
و هچنین
if (Request.QueryString["ID"]!= "")

اينطور روش اشتباهي هست ، در صورتي كه key وجود نداشته باشد با خطاي Object Reference مواجه خواهيد شد .

شاد باشيد

Peyman.Gh
پنج شنبه 06 خرداد 1389, 14:58 عصر
اينطور روش اشتباهي هست ، در صورتي كه key وجود نداشته باشد با خطاي Object Reference مواجه خواهيد شد .

شاد باشيد

منظور شما از Key , پارامتر میباشد ؟!

Mostafa_Dindar
پنج شنبه 06 خرداد 1389, 15:03 عصر
منظور شما از Key , پارامتر میباشد ؟!

در پست دوم ( اين تاپيك ) عرض كردم ، QueryString به صورت جفت هاي Key & Value ارسال ميشن .

Peyman.Gh
پنج شنبه 06 خرداد 1389, 22:31 عصر
اينطور روش اشتباهي هست ، در صورتي كه key وجود نداشته باشد با خطاي Object Reference مواجه خواهيد شد .

شاد باشيد

اشتباه نیست اگر پارامتر را مشخص نکنیم با خطای Object Reference مواجه میشود.

if (Request.QueryString["ID"] == null)

if (Request.QueryString["ID"] != null)

Mostafa_Dindar
پنج شنبه 06 خرداد 1389, 22:42 عصر
اشتباه نیست اگر پارامتر را مشخص نکنیم با خطای Object Reference مواجه میشود.

if (Request.QueryString["ID"] == null)
if (Request.QueryString["ID"] != null)

اگر پارامتر را مشخص نكنيم ، يا پارامتر را اشتباه نامگذاري كنيم يا ... با خطا مواجه ميشيم .

ولي اگر Query String رو با NULL مقايسه كنيم با خطا مواجه نخواهيم شد .

در جايي كه كد Stable تر وجود دارد چرا از كد ناقص و Bug دار استفاده كنيم !؟

Mostafa_Dindar
شنبه 08 خرداد 1389, 02:01 صبح
البته میتوان رشته تقاضا را با استفاده کلاس DESCryptoServiceProvider رمز نگاری کرد .
http://barnamenevis.org/forum/showpost.php?p=988525&postcount=5


قبلا در پست 2 عرض كرده بودم :


- موارد بسيار پيش خواهد آمد كه دوست نداريد كاربران با تغير Value در Address Bar به صفحات ديگر دسترسي داشته باشند . در اين صورت ميتونيد به شيوه ارائه شده در اين مقاله (http://nayyeri.net/how-to-encrypt-query-string-parameters-in-asp-net) اون رو encript كنيد .



شاد باشيد

mohsen_namad
چهارشنبه 12 خرداد 1389, 14:08 عصر
من می خواستم اطلاعات چند تا تکس باکس رو از طریق رشته تقاضا به صفحه دیگه منتقا کنم اما نمیشه اینم کدمه:
این صفحه اصلیمه:


string s;
s = "Default2.aspx";
s += "?t1" + t1.Text;
s += "?t2" + t2.Text;
s += "?t3" + t3.Text;
s += "?t4" + t4.Text;
Response.Redirect(s);


این صفحه مقصده:



l1.Text += Request.QueryString["t1"] + "<br>";
l1.Text += Request.QueryString["t2"] + "<br>";
l1.Text += Request.QueryString["t3"] + "<br>";
l1.Text += Request.QueryString["t4"] + "<br>";

Mostafa_Dindar
چهارشنبه 12 خرداد 1389, 14:29 عصر
string s;
s = "Default2.aspx";
s += "?t1=" + t1.Text;
s += "&t2=" + t2.Text;
s += "&t3=" + t3.Text;
s += "&t4=" + t4.Text;
Response.Redirect(s);

مساوي رو كه اصلا نگذاشته بودي + فقط دفعه اول لازمه ؟ بزاي دفعه هاي بعد & لازمه


موفق باشي

mohsen_namad
چهارشنبه 12 خرداد 1389, 14:34 عصر
دستت درد نکنه مشکلم حل شد.