PDA

View Full Version : گفتگو: بهترین نحوه استفاده از Ajax در صفحات وب



naser2009
چهارشنبه 31 شهریور 1389, 09:28 صبح
سلام دوستان خسته نباشید

بنده مدتی است که ajax را با استفاده از jQuery و WebMethod ها کار می کنم میخواستم نظر دوستان را در مورد بحث های های امنیتی، سرعت و .... در مورد این روش بدانم

نمونه کد مورد استفاده من:


function GetCitiesByStateID(stateid) {
$.ajax({
type: "POST",
url: "SendMultiMediaContent.aspx/GetCitiesByStateID",
data: "{'StateID':'" + stateid + "'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
var Cities = msg.d;
var counter = Cities.length;
$('#<%=ddlCity.ClientID%>').empty();
$("#<%=ddlCity.ClientID%>").get(0).options.length = 0;
$("#<%=ddlCity.ClientID%>").get(0).options[0] = new Option(" .", "-1");
for (var i = 0; i < counter; i++) {
$('#<%=ddlCity.ClientID%>').
append($("<option></option>").
attr("value", Cities[i].CityID).
text(Cities[i].Name));
}
},
error: function() {
return -1;
}
});
}

این نمونه کدی است که داخل فایل aspx هست و در مواقعی که dropdownlist استانها تغییر می کند شهرهای آن استان را به dropdown بعدی بایند می کند.

واین هم وب متدی که اطلاعات را از بانک می گیرد.




[WebMethod]
public static object GetCitiesByStateID(long StateID)
{
City Citycs = new City();
return Citycs.GetCitiesByStateID(StateID).ToArray();
}


آیا استفاده از این روش از لحاظ امنیتی مشکلی ندارد؟
آیا روش بهتری هم وجود دارد؟
و..........

با تشکر از دوستانی که در این مبحث شرکت میکنند.:لبخندساده:

milade
چهارشنبه 31 شهریور 1389, 09:52 صبح
من كه مشكلي توي كدت نميبينم .
چرا بايد مشكل داشته باشه ؟

naser2009
چهارشنبه 31 شهریور 1389, 10:57 صبح
یه سوال؟
اگه کسی اسمه صفحه و اسم وب متود منو بدونه نمیتونه از تو یه سایت دیگه اونا رو فراخوانی کنه؟

به چه نحو میشه تشخیص داد کسی که authenticate کرده، داره متد رو فراخوانی میکنه؟

javad_mjt
چهارشنبه 31 شهریور 1389, 11:00 صبح
سلام من یه راه به ذهنم میرسه
اینکه با استفاده از httpcontext.current.session
session کاربر رو سمت webmethod برسی کنی اگه session معتبر بود webmethod کار مورد نظر رو انجام بده.
نمی دونم تا چه حد این کار منطقی هست؟

naser2009
چهارشنبه 31 شهریور 1389, 16:39 عصر
سلام خوبه این روشم هم قابل استفاده است
ولی بیشتر نظره من این بود که روی امنیت این روش(نوشتن ajax با استفاده از jquery)بحث بشه آخه میدونین چیزهایی که کاربران بهش دسترسی داره

1) اسم وب متد

url: "SendMultiMediaContent.aspx/GetCitiesByStateID",
2) نام فیلدها

data: "{'StateID':'" + stateid + "'}",
3) اسم فیلدهای جدول هام

attr("value", Cities[i].CityID).

آیا دانستن این اطلاعات توسط بازدیدکنندگان خطر امنیتی در بر نداره؟

milade
چهارشنبه 31 شهریور 1389, 20:58 عصر
هيچ كدوم مشكلي نداره جز نام فيلد هاي بانك اونم كم ...
ميتوني بعد از خودن ار بانك توي يه ديتاست ديگه نام فيلدها رو تغيير بدي تا مشكل حل شه ..

مورد اول هم اگه نگراني در IIS7 ( شش رو نميدونم ) ميتوني از اعتبار سنجي URL استفاده كني .

Vahid_moghaddam
چهارشنبه 31 شهریور 1389, 21:09 عصر
در مورد اینکه آیا کاربر (درخواست) مجاز به استفاده از webmethod یا webservice هست، می تونید از مکانیزمی که برای تایید هویت در قسمت های دیگه پروژه استفاده می کنید، در method هم استفاده کنید .

javad_mjt
پنج شنبه 01 مهر 1389, 09:26 صبح
ميتوني بعد از خودن ار بانك توي يه ديتاست ديگه نام فيلدها رو تغيير بدي تا مشكل حل شه ..
یا زمان select گرفتن از جدول بعد از هر فیلد یک as بزاریم و نام مستعار به فیلد بدیم


در مورد اینکه آیا کاربر (درخواست) مجاز به استفاده از webmethod یا webservice هست، می تونید از مکانیزمی که برای تایید هویت در قسمت های دیگه پروژه استفاده می کنید، در method هم استفاده کنید .یعنی اگه واسه فولدری که webmethod داخل اون قرار داره مثلا یه role تعریف بشه فقط اونایی به اون متد دسترسی دارن که اون role رو دارند؟

milade
پنج شنبه 01 مهر 1389, 09:34 صبح
یعنی اگه واسه فولدری که webmethod داخل اون قرار داره مثلا یه role تعریف بشه فقط اونایی به اون متد دسترسی دارن که اون role رو دارند؟
مثلاً 2 تا ايتم ديگه بدي به نام يوزر و پسور و تاييد هويت رو انجام بدي ، اگر معتبر بود پاسخ بدي وگرنه هيچ ...

aminghaderi
جمعه 02 مهر 1389, 00:11 صبح
بهترین نحوه استفاده از Ajax در صفحات وب
ملاک بهترین روش صرفا امنیت نیست(که همون امنیت اجکس بحث خودش رو داره) بلکه خیلی چیزها هست که باید رعایت شود (امنیت + مدیریت درخاست ها + بهینه سازی + ...). (تجربه شخصی)
بهتربن روش از نظر من استفاده از متد ها و کنترل های هست که برای دات نت کار ها توسط یه سری متخصص نوشته شده است (در صورت هجم بالا انتقال مثلا 10 تا فیلد به بالا ) برای مثال : Ajax Extension ، Ajax Toolkit و ... و در صورت فقط یه فیلد یا مقدار مد نظر دارید خوب همین روش یا روش ها مشابه بهترین گزینه خواهد بود.
روشی که شما استفاده می کنید (CallBack) برای موادی که انتقال یه یا دو فیلد مد نظر هست به نظر من عالی می تونه باشه.
از لحاظ امنیتی این روش هم که دوستان توضیح دادند.

موفق باشید.

Vahid_moghaddam
جمعه 02 مهر 1389, 09:55 صبح
روشی که شما استفاده می کنید (CallBack) برای موادی که انتقال یه یا دو فیلد مد نظر هست به نظر من عالی می تونه باشه.


موفق باشید.
میشه در این مورد توضیح بدید؟
فرض کنید من می خوام صد تا فیلد رو بفرستم به server. چرا استفاده از ajax control toolkit بهتره؟
به خاظر کاهش کد نویسی؟
در هر حال سرعت ارسال و دریافت با استفاده از page method ها خیلی بیشتر از زمانیه که از update panel استفاده می شه.

naser2009
جمعه 02 مهر 1389, 10:03 صبح
بهتربن روش از نظر من استفاده از متد ها و کنترل های هست که برای دات نت کار ها توسط یه سری متخصص نوشته شده است (در صورت هجم بالا انتقال مثلا 10 تا فیلد به بالا ) برای مثال : Ajax Extension ، Ajax Toolkit و ...

آیا به نظر شما استفاده از کنترل های msajax خود مایکروسافت بهتره؟
استفاده از update panel و script manager ؟ ولی این کنترل ها به صورت پیش فرض خیلی حجم صفحه رو بالا می برند.
شما حجم صفحه قبل و بعد از گذاشتن این دوتا کنترل تست کن خیلی فرق میکنه.
--------------------

فرض کنید من می خوام صد تا فیلد رو بفرستم به server. چرا استفاده از ajax control toolkit بهتره؟


خود شما موقعی که بخواهید این حجم داده رو به سرور بفرستید چیکار میکنید؟
آیا از همین فرمت json برای ارسال اطلاعات استفاده می کنید؟

با تشکر:خجالت:

Vahid_moghaddam
جمعه 02 مهر 1389, 10:09 صبح
آیا به نظر شما استفاده از کنترل های msajax خود مایکروسافت بهتره؟
استفاده از update panel و script manager ؟ ولی این کنترل ها به صورت پیش فرض خیلی حجم صفحه رو بالا می برند.
شما حجم صفحه قبل و بعد از گذاشتن این دوتا کنترل تست کن خیلی فرق میکنه.
--------------------


خود شما موقعی که بخواهید این حجم داده رو به سرور بفرستید چیکار میکنید؟
آیا از همین فرمت json برای ارسال اطلاعات استفاده می کنید؟

با تشکر:خجالت:
آره. استفاده از json. و مشکلی هم پیش نیومده. در واقع می خوام بدونم وقتی دوستمون می گن این روش برای ارسال و دریافت حجم های کوچک دادهف مناسبه، دلیلشون چیه؟

profnami
جمعه 02 مهر 1389, 10:38 صبح
الان بهترين راه چي شد؟
من كه استفاده از كنترل هاي مايكروسافت رو خيلي جالب نميدونم . چون هم حجيم هستند هم زياد دوست ندارم با كنترل هاي ماده كار كنم .
اما فرضا ما بخوايم يه ركورد يا دو ركورد رو كه مقدارشون زياده فرضا با 500 كاراكتر درج كنيم يا ويرايش كنيم كدوم راه حل بهتره ؟

javad_mjt
جمعه 02 مهر 1389, 12:07 عصر
تا جایی که من اطلاع دارم updatepanel علاوه بر اطلاعاتی که مورد نیاز کلی اطلاعات اضافه دیگه ای رو هم می فرسته. ولی با page method فقط همون اطلاعاتی که مورد نیاز هست ارسال و دریافت میشه.
به نظر من استفاده از page method و json برای ajax مناسب تر هست.

aminghaderi
جمعه 02 مهر 1389, 15:02 عصر
میشه در این مورد توضیح بدید؟
فرض کنید من می خوام صد تا فیلد رو بفرستم به server. چرا استفاده از ajax control toolkit بهتره؟
به خاظر کاهش کد نویسی؟
در هر حال سرعت ارسال و دریافت با استفاده از page method ها خیلی بیشتر از زمانیه که از update panel استفاده می شه.

با سلام و ارادت خدمت استاد مقدم و بقیه دوستان
من جدیدا یه پروژه نوشتم که کاملا اجکسی بود و از روش هسته اجکس (XmlHttpRequest) استفاده کرده بودم و طی این پروژه که فقط نوشتنش 3 تا 4 ماه طول کشید ، فهمیدم که بهترین گزینه برای ارسال هجم بالای اطلاعات روش است که خود ماکروسافت پیشنهاد می کنه (کامپوننت های اجکسی مثل همان اجکس Toolkit,...) .

خوب دلیل :
پروژه ای که روش کار می کردم ، در بعضی از بخش هاش قرار بود چندید پارامتر با مقدادیر هجیم به سرور ارسال کنم ، خوب ابتدا توابعی طراحی کردم برای ارسال پارامتر ها و دریافت پارامتر ها به صورت کلی و بعد مجبور شدم ، امنیت رو حفظ کنم ، پس توابعی هم برای امنیت اضافه شد و بعد بحث عمیق کنترل خطا پیش آمد و.... خوب فایل js که به صفحات من هندل می شد ، هجم خیلی زیادی داشت و همچنین بهینه نبود .
اما کنترل های خود دات نت مثلا UpdatePanel خوب ما راحت بدون دردسر این کنترل رو به صفحه اضافه می کنیم و بعد کلی کار می تونیم باهاش انجام بدیم و از همه مهمتر این هست که خود مهندس های دات نت بحث های امنیت ، کنترل موارد خاص که حتی برای ما شاید اصلا پیش نیامده باشه ، رو در کنترل ها پیش بینی کرده اند و همچنین بهینه هست.

هجم بالای کامپوننت یا هجم بالای اطلاعات هنگام Transfer دلیل بر عدم بهینه بودن کنترل نیست ،اون هم کنترل های که از فیلتر خود ماکروسافت عبور می کنند ، به نظر من دلیل می تونه همون پیشبینی موارد خاص باشه که حتمی لازم بوده که در کنترل قرارش دادند.
مثلا از یکی از مشتریان من شنیدم که زمانیکه کاراکتر های خاص رو در مطلب خود قرار می ده وارسال می کنه ، بجاش یه سری کد در داخل صفحه سایتش می بینه ، خوب ما کلی مکافات داشتیم با این موضوع که بعد خودمان یه تابع سمت سرور نوشتیم تا این موضوع برطرف بشه و....

البته این ها همه نظر و تجربه شخصی من هست ، باور کنید من در اون پروژه اینقدر فکرم مشغول شده بود که تا چند وقت به همین شی Xml.... آلرژی پیدا کرده بودم ، اما وقتی کامپوننت هایی در این رابطه تولید شده چرا از اون ها استفاده نشه ؟! کامپوننت هایی که حاصل تجربه تلخ یا شیرین یه سری برنامه نویس ماهر هست.
من الان حضور ذهن ندارم ، ولی کافیه یه سرچ در گوگل انجام بدیم ، کلی کنترل اجکسی هست حتی با JQuery خوب وقتی هست چه نیاز به دباره نویسی هست.

پاورقی : اگر پروژه ای خاص باشه و هسته اون باید سکرت بمونه ، خوب منطقی هست که بشینیم و یه کنترل شخصی درست کنیم ، حالا هرچقدر هم زمان و نیرور نیاز داشته باشه.

Vahid_moghaddam
جمعه 02 مهر 1389, 18:05 عصر
استفاده از xmlhttprequest دشواری های خودش رو داره. از طرف دیگه استفاده از کنترل های آماده شده هم، اولین مساله ای رو که بوجود میاره، افزایش حجم ارسال و دریافته. در لینک مطلب خوبی در این مورد وجود داره:
http://encosia.com/2007/07/11/why-aspnet-ajax-updatepanels-are-dangerous/

شاید استفاده از jquery ajax به دلیل کاهش کدنویسی javascript (و روش های شبیه به اون) راه حل مناسبی باشه.
البته در جاهایی هم اگه قرار باشه تمام کدنویسی توسط برنامه نویس انجام بشه، اونقدر کار طولانی می شه که عملا زمان صرفه جویی شده در بارگذاری صفحه ها بی ارزش می شه. مثلا فرض کنید قراره یه گریدویو داشته باشید با امکانات خاص. خب شاید روش مناسب استفاده از مثلا DevExpress باشه و اطمینان به اینکه در این کنترل (که از شرگت بسیار معتبریه) پیاده سازی ajax به بهترین شکل انجام شده.