PDA

View Full Version : ادیتوری که توش نیاز به ست کردن ValidateRequest="false" نباشه؟



explod_javad
پنج شنبه 26 شهریور 1388, 12:58 عصر
با سلام
ادیتور CuteSoft نیاز به ست کردن ValidateRequest="false" نداره
آیا ادیتور دیگری هم وجود دارد که این مزیت رو داشته باشه

مهدی کرامتی
پنج شنبه 26 شهریور 1388, 16:04 عصر
چنین چیزی ممکن نیست، بخاطر اینکه اگر در فیلدهای ورودی صفحه هر گونه تگی قرار گیرد مکانیسم اعتبارسنجی خودکار ASP.NET آن مقدار را مورد هدف قرار می دهد.

خروجی همه Web Editor ها تگ های HTML است و شامل قاعده فوق می شود، مگر اینکه InputValidation را خاموش کنید. CuteEditor هم از این قاعده مستثنی نیست.

Chabok
پنج شنبه 26 شهریور 1388, 16:32 عصر
در ادامه فرمایشات جناب کرامتی

اصلاً بحث Editor نیست . هنگامی که ValidateRequest=false باشد شما حتی بصورت Query هم نمی توانید پارامتر بصورت ناامن ارسال کنید .

یعنی چنین پارامتری نیز در Query غیر قابل قبول است :
?s=<a />یعنی تمامی پارامترهای ارسالی اعم از post,get باید مجاز باشند .
موفق باشید . خدانگهدار

alireza_s_84
پنج شنبه 26 شهریور 1388, 19:57 عصر
سلام راه حلی مبتنی بر کلاینت وجود داره بدون اینکه ValidateRequest را false کنیم که بسیار ضروری هم هست(جهت جلوگیری از تزریق کدهای مخرب)
شما محتوای HTML که میخواین پست کنید رو با متد encodeURI جاوا اسکریپت کد کنید در اینصورت دیگه مشکلی در سمت سرور ندارید فقط دو نکته میمونه:
1- شما اطلاعات رو همینطور کد شده توی دیتابیس ذخیره میکنید.
2- دوست ندارید اطلاعات کد شده (که قابل خوندن نیستن) رو ذخیره کنید.

سناریو 1) شما بعد از ذخیره اطلاعات هروقت خواستین اطلاعات رو دوباره نشون بدین باید متد مقابل کدینگ یعنی decodeURI جاوااسکریپت رو بر روی همون محتوای ذخیره شده اجرا کنید تا اطلاعات از کدگزاری دربیاد و قابل نمایش باشه .(روشی بسیار مطمئن اما وابسته به کلاینت)

سناریو 2) شما ابتدا فضای نام Microsoft.JScript.GlobalObject رو وارد پروژه تون کنید بعد با استفاده از متد
decodeURI اطلاعات رو decode کنید و در در دیتابیس ذخیره کنید.(احتمال تزریق کدهای مخرب زیاده)
یک سناریو دیگه وجود داره که ترکیبی از هر دو مورده و امنیت بیشتری داره و مایکروسافت هم تاکید کرده توضیح دادنش وقت گیره فرصت کردم توضیح میدم
اگر از دوستان کسی متوجه مطالب فوق نشد ایمیل بزنه تا با مثال توضیح بدم
موفق باشید
alireza_s_84@yahoo.com

Behrouz_Rad
پنج شنبه 26 شهریور 1388, 20:24 عصر
alireza_s_84@
روش هایی که گفتی قابل استفاده نیستند چون من به عنوان یک فرد متخاصم، جاوا اسکریپت رو در مرورگرم غیر فعال می کنم. هیچ وقت به روش های مبتنی بر کلاینت اطمینان نکن.
ValidateRequest همیشه باید false باشه. هدف مایکروسافت از true قرار دادن پیش فرض این خاصیت، یادآوری به برنامه نویس برای هشدار در مورد هندل داده های ارسالی به برنامه بوده. برنامه نویس باید این مقدار رو همیشه false و داده ها رو خودش هندل کنه.
داده ها قبل از قرار گرفتن در هر منبع داده ای باید از متد HtmlEncode کلاس HttpUtility عبور کنند.
ضمن اینکه کتابخانه ی AntiXss مایکروسافت هم وجود داره که بررسی های بیشتری بر روی داده ها انجام میده.

موفق باشید.

alireza_s_84
پنج شنبه 26 شهریور 1388, 23:05 عصر
[quote=Behrouz_Rad;808084]alireza_s_84@
روش هایی که گفتی قابل استفاده نیستند چون من به عنوان یک فرد متخاصم، جاوا اسکریپت رو در مرورگرم غیر فعال می کنم. هیچ وقت به روش های مبتنی بر کلاینت اطمینان نکن.



بهروز جان با اینکه نباید به کلاینت اعتماد کرد کاملا موافقم اصلا در طراحی وب باید جاوا رو غیر فعال کرد و سایت رو طراحی کنیم

ValidateRequest
همیشه باید false باشه. هدف مایکروسافت از true قرار دادن پیش فرض این خاصیت، یادآوری به برنامه نویس برای هشدار در مورد هندل داده های ارسالی به برنامه بوده. برنامه نویس باید این مقدار رو همیشه false و داده ها رو خودش هندل کنه.
در مورد ValidateRequest باید فعال باشه چون ما نمیخوایم اجازه بدیم که کاربر محتوای HTML به برنامه ارسال کنه. اتفاقا باید فعال باشه جهت بررسی ( dangerous values).



داده ها قبل از قرار گرفتن در هر منبع داده ای باید از متد HtmlEncode کلاس HttpUtility عبور کنند.
ضمن اینکه کتابخانه ی AntiXss مایکروسافت هم وجود داره که بررسی های بیشتری بر روی داده ها انجام میده.

موافقم اما من صحبتی در مورد نحوه ذخیره سازی نکردم بله باید قبل از ذخیره سازی از HtmlEncode استفاده کرد .
ضمنا روشی که گفتم کاملا هم جواب میده چون اگر کاربر جاوااسکریپت رو غیرفعال کنه اصلا کدگزاری روی داده ها صورت نمیگیره و با فعال بودن ValidateRequest اصلا درخواست با خطا مواجه میشه اگر هم با ترفندهایی درخواستش رو بصورت کدگزاری به سمت سرور بفرسته خوب زمان ذخیره کردن ما از HtmlEncode استفاده میکنیم اما این متد با روشی که من برای کدگزاری گفتم فرق میکنه ابتدا باید decode کنیم بعد برای ذخیره کردن از این متد استفاده کنیم .
ضمنا اگر بحث بر سر کدهای مخرب باشه و نحوه مدیریت و برقراری امنیت دیگه در یه لایه دیگه باید صورت بگیره و برای مثال میتونیم کلاسی داشته باشیم که اگر داده های دریافتی حاوی بلوکهای اجرایی اسکریپت باشن رو حذف و بعد داده ها رو ذخیره کنه.
در کل بحث من روشی برای ارسال داده های حاوی HTML به سرور بود و چگونگی رفتار با اونا در زمینه امنیت هم مخالف گفته های شما نیستم اما بهترین راه برای رفتار با Editor ها همین روشه . من با غیر فعال کردن ValidateRequest مخالفم و اگر نیاز به پیاده سازی امنیت بشتری هستیم میتونیم در لایه بعد اینکار رو انجام بدیم ابتدا درخواست رو دریافت کنیم خود asp.net بررسی میکنه هیچ کد HTML رو نمیبینه که بخواد جلوگیری کنه بعد نوبت به ما میرسه decode میکنیم داده ها رو پردازش میکنیم اگر حاوی بلوکهای اجرایی اسکریپت تا مواردی که خودمون تعیین میکنیم بود پاکسازی میکنیم یا اصلا میتونیم ذخیره نکنیم و به کاربر پیغامی مبنی بر وجود کدهای غیر معتبر برگشت بدیم.
بعد از بررسی صحت داده ها میتونیم با HtmlEncode داده ها رو ذخیره کنیم.
منتظر پاسختون هستم مهندس راد
موفق باشید

Behrouz_Rad
جمعه 27 شهریور 1388, 00:28 صبح
ضمنا روشی که گفتم کاملا هم جواب میده چون اگر کاربر جاوااسکریپت رو غیرفعال کنه اصلا کدگزاری روی داده ها صورت نمیگیره و با فعال بودن ValidateRequest اصلا درخواست با خطا مواجه میشه

دوست من!
دقیقاً مشکل همینجاست که برنامه نباید با خطا مواجه بشه! چون ذات Editor ها تولید تگ های HTML هست!
سناریوی ذیل رو در نظر بگیر:

من یک هکر هستم. جاوا اسکریپت رو غیر فعال می کنم و وارد صفحه ای میشم که در اون یک Editor وجود داره. مقداری متن با کمی افکت در اون Editor وارد می کنم و بر روی دکمه ی Submit کلیک می کنم. تو برنامه نویس اون سایت هستی. ValidateRequest رو true کردی و با جاوا اسکریپت سعی می کنی که داده ها رو قبل از ارسال Encode کنی اما چون جاوا اسکریپت غیر فعاله، من از فیلتر تو عبور می کنم. چه اتفاقی می افته؟ واضحه! صفحه با خطا مواجه میشه و من نمی تونم داده ها رو ثبت کنم! حالا متوجه شدی چرا ValidateRequest باید همیشه false باشه؟

موفق باشید.

explod_javad
جمعه 27 شهریور 1388, 01:08 صبح
با سلام
همانطور که قبلا کفتم من از ادیتور CuteSoft استفاده می کنم
و توی صفحه ، خاصیت ValidateRequest ترو هست(اصلا تغییر ندادم)
حالا هم ادیتور من خوب کار میکنه و هم موقعی که توی یک Textbox مقادیر HTML درج میکنم زمان Submit صفحه ، پیام خطا صادر میشه(هشدار که امکان ارسال تک های اچ تی ام ال نیست؟
توی مابقی ادیتور ها این ویژه گی وجود نداشت!
حالا نمی دونم که پشت پرده چه اتفاقی می افته ؟

alireza_s_84
جمعه 27 شهریور 1388, 03:09 صبح
همانطور که قبلا کفتم من از ادیتور CuteSoft استفاده می کنم
و توی صفحه ، خاصیت ValidateRequest ترو هست(اصلا تغییر ندادم)
حالا هم ادیتور من خوب کار میکنه و هم موقعی که توی یک Textbox مقادیر HTML درج میکنم زمان Submit صفحه ، پیام خطا صادر میشه(هشدار که امکان ارسال تک های اچ تی ام ال نیست؟

مطمئنا این ادیتور کدها رو به روشی که گفتم میسازه. من این ادیتور رو ندارم حالا سعی میکنم پیداش کنم و بررسی کنم که چطور کار میکنه


دوست من!
دقیقاً مشکل همینجاست که برنامه نباید با خطا مواجه بشه! چون ذات Editor ها تولید تگ های HTML هست!
سناریوی ذیل رو در نظر بگیر:

من یک هکر هستم. جاوا اسکریپت رو غیر فعال می کنم و وارد صفحه ای میشم که در اون یک Editor وجود داره. مقداری متن با کمی افکت در اون Editor وارد می کنم و بر روی دکمه ی Submit کلیک می کنم. تو برنامه نویس اون سایت هستی. ValidateRequest رو true کردی و با جاوا اسکریپت سعی می کنی که داده ها رو قبل از ارسال Encode کنی اما چون جاوا اسکریپت غیر فعاله، من از فیلتر تو عبور می کنم. چه اتفاقی می افته؟ واضحه! صفحه با خطا مواجه میشه و من نمی تونم داده ها رو ثبت کنم! حالا متوجه شدی چرا ValidateRequest باید همیشه false باشه؟

جناب راد اگر ValidateRequest فعال باشه و شما جاوا رو غیر فعال کنید که نمیتونید از فیلتر من عبور کنید چون ValidateRequest اجازه ورود هیچ HTML رو به برنامه نمیده. تا ما کدهای HTML رو کد نکنیم این خصوصیت اجازه استفاده از داده های حاوی HTML رو به ما نمیده
ضمنا هیچ ادیتوری بدون جاوا اسکریپت کار نمیکنه پس بهتر که خطا بده (البته هندل کردن خطا هم یادتون نره)
مطمئنا کد HTML که توسط یک Editor ساخته شده باید توسط جاوا بوده باشه هیچ راهی برای اینکار وجود نداره(فلش هم از جاوا استفاده میکنه ، Editor های Ajax هم از جاوا استفاده می کنن)
حالا شما جاوا اسکریپت رو غیر فعال کن و با خطا روبرو بشین خوب معلومه قصد شما تک زدن بودن و جوابتون ضد تک.
اما شما یک کاربر خوب هستین جاوا فعال ، ادیتور HTML رو تولید میکنه جاوا زحمت میکشه کد میکنه و میفرسته سمت سرور . داده ها چک میشن در لایه اول که توسط خود ASP.NET هست هیچ مورد مشکوکی یافت نمیشه حالا لایه دوم با ماست داده ها decode میکنیم بعد چک میکنیم کدهای مخرب رو پاک میکنیم(تنها اسکریپتها) و داده ها رو به روش هایی که قبلا گفتم ذخیره میکنیم
برای handel کردن خطا هم رویداد page_onerror هست (خدا خیرش بده) پس نمیدونم دیگه هکر میخواد چه جوری ضربه بزنه؟؟؟
نوع خطا هم برای برنامه مشخصه که چه طور handel کنیم پس هیچ اطلاعاتی که دست هکر رو باز بذاره توی اینمورد وجود نداره!

h.alizadeh
جمعه 27 شهریور 1388, 06:14 صبح
توی کنترل های ajax control toolkit نسخه ی 3 یک کنترلEditorداره اونم به خاصیتValidateRequest کاری نداره یعنی اگه trueهم باشه مشکلی نیست.

کسی ازش استفاده کرده یا نه؟(زیاد جالب نیست البته؛ چون وقتی صفحه رفرش میشه یه جوری ه جمع میشه بعد باز میشه ؛ نمی دونم من باهش ور نرفتم زیاد در حد یک تست کردن دیدم.)

Behrouz_Rad
جمعه 27 شهریور 1388, 10:16 صبح
مطمئنا این ادیتور کدها رو به روشی که گفتم میسازه. من این ادیتور رو ندارم حالا سعی میکنم پیداش کنم و بررسی کنم که چطور کار میکنه

جناب راد اگر ValidateRequest فعال باشه و شما جاوا رو غیر فعال کنید که نمیتونید از فیلتر من عبور کنید چون ValidateRequest اجازه ورود هیچ HTML رو به برنامه نمیده. تا ما کدهای HTML رو کد نکنیم این خصوصیت اجازه استفاده از داده های حاوی HTML رو به ما نمیده
ضمنا هیچ ادیتوری بدون جاوا اسکریپت کار نمیکنه پس بهتر که خطا بده (البته هندل کردن خطا هم یادتون نره)
مطمئنا کد HTML که توسط یک Editor ساخته شده باید توسط جاوا بوده باشه هیچ راهی برای اینکار وجود نداره(فلش هم از جاوا استفاده میکنه ، Editor های Ajax هم از جاوا استفاده می کنن)
حالا شما جاوا اسکریپت رو غیر فعال کن و با خطا روبرو بشین خوب معلومه قصد شما تک زدن بودن و جوابتون ضد تک.
اما شما یک کاربر خوب هستین جاوا فعال ، ادیتور HTML رو تولید میکنه جاوا زحمت میکشه کد میکنه و میفرسته سمت سرور . داده ها چک میشن در لایه اول که توسط خود ASP.NET هست هیچ مورد مشکوکی یافت نمیشه حالا لایه دوم با ماست داده ها decode میکنیم بعد چک میکنیم کدهای مخرب رو پاک میکنیم(تنها اسکریپتها) و داده ها رو به روش هایی که قبلا گفتم ذخیره میکنیم
برای handel کردن خطا هم رویداد page_onerror هست (خدا خیرش بده) پس نمیدونم دیگه هکر میخواد چه جوری ضربه بزنه؟؟؟
نوع خطا هم برای برنامه مشخصه که چه طور handel کنیم پس هیچ اطلاعاتی که دست هکر رو باز بذاره توی اینمورد وجود نداره!
من تا زمانی بحث می کنم که احساس کنم فرد مقابلم قصد مغلته و پافشاری بر حرف اشتباه خودش رو نداره... فقط دو تا نکته رو اضافه می کنم.
1) جاوا اسکریپت رو قبل از کلیک بر روی دکمه ی Submit غیر فعال کن.
2) اصلاً فرض کن یک TextBox ساده وجود داره که از جاوا اسکریپت استفاده نمی کنه. مثل بخش ویرایش قالب سایت های ارائه دهنده ی خدمات وبلاگ.

با دقت بیشتری پست قبلیم (پست 7) رو بخون.

موفق باشید.

alireza_s_84
جمعه 27 شهریور 1388, 14:23 عصر
من تا زمانی بحث می کنم که احساس کنم فرد مقابلم قصد مغلته و پافشاری بر حرف اشتباه خودش رو نداره... فقط دو تا نکته رو اضافه می کنم.
1) جاوا اسکریپت رو قبل از کلیک بر روی دکمه ی Submit غیر فعال کن.
2) اصلاً فرض کن یک TextBox ساده وجود داره که از جاوا اسکریپت استفاده نمی کنه. مثل بخش ویرایش قالب سایت های ارائه دهنده ی خدمات وبلاگ.

با دقت بیشتری پست قبلیم (پست 7) رو بخون.

موفق باشید.

جناب راد یک Textbox قرار میدیم و یک Button برای ارسال داده ها. جاوا اسکریپت هم غیر فعال!!!
validateRequest هم بر روی True ست شده. کد زیر رو وارد TextBox میکنیم و فرم رو میفرستیم :



<script>alert('a')</script>


خوب صفحه به دلیل وجود کدهای HTML با خطا مواجه میشه و پردازش نمیشه.
حالا ما یک Handel برای این خطا مینویسیم و چک میکنیم اگه این خطا از نوع dangerous Request باشه کاربر به یک صفحه کنترل خطا هدایت میشه.
حالا چه منطق غلطی وجود داره؟
نمونه میذارم دوستان نظر بدن. من پافشاری نمیکنم بلکه با دلیل صحبت میکنم. شما نمونه بذار تا من قانع بشم(مطمئنا خوشحال میشم از اشتباه دربیام من که عقل کل نیستم)
دوستان برای تست نمونه لطف کنید جاوااسکریپت رو غیرفعال کنید (هرچند فرقی نمیکنه) ضمنا دوستانی که با این نوع حملات آشنایی ندارن میتونن ValidateRequest رو False کنن و جاوا اسکریپت رو فعال تا نتیجه رو ببین.
موفق باشید

Behrouz_Rad
جمعه 27 شهریور 1388, 14:35 عصر
برادر من، اصلاً خطا نباید رخ بده!!!!!!!!!!!!! ValidateRequest باعث میشه خطا رخ بده!!!!!!!!!!!!! اگر ValidateRequest برابر با true باشه، من چطور می تونم داده ها رو در دیتابیس ذخیره کنم؟ هندلر ValidateRequest اولین هندلری هست که در چرخه ی حیات صفحه اجرا میشه. وقتی جاوا اسکریپت غیر فعال هست، اون متد شما اجرا نمیشه، بنابراین داده ها به صورت متن ساده به سرور ارسال میشن و خطا رخ میده!

خطا نباید رخ بده!

والا دیگه نمی دونم چطور بگم...!

alireza_s_84
جمعه 27 شهریور 1388, 14:45 عصر
برادر من، اصلاً خطا نباید رخ بده!!!!!!!!!!!!! ValidateRequest باعث میشه خطا رخ بده!!!!!!!!!!!!! اگر ValidateRequest برابر با true باشه، من چطور می تونم داده ها رو در دیتابیس ذخیره کنم؟ هندلر ValidateRequest اولین هندلری هست که در چرخه ی حیات صفحه اجرا میشه. وقتی جاوا اسکریپت غیر فعال هست، اون متد شما اجرا نمیشه، بنابراین داده ها به صورت متن ساده به سرور ارسال میشن و خطا رخ میده!

خطا نباید رخ بده!

والا دیگه نمی دونم چطور بگم...!

بهروز جان خطا هندل میشه . توی نمونه که گذاشتم(ضمنا خطاش اصلا خطای مهمی نیست)
ضمنا منه برنامه نویس تعیین میکنم که کاربر چه متن HTML رو مجازه برای سرور بفرسته. اگر جاوا غیر فعال باشه طبیعتا من اجازه نمیدم کاربر هیچ کد HTML رو برای پردازش به برنامه بده و در همون ذرخواست اونو کنترل میکنم.
اگر ما نیاز به ارسال کدهای HTML داریم (کدهایی که مستقل از جاوا باشن و برای مثال کپی کرده باشیم) اونوقت باید ValidateRequest رو غیر فعال کنیم
من نمیخوام روی این روش پافشاری کنم روشی که من گفتم بهترین روش برای کنترل داده هایی که با HTML Editor ها ساخته شده.
و در موارد دیگه بستگی به شرایط داره که آیا میخواهیم از جاوا استفاده کنیم یا خیر؟؟؟
رویهم رفته من نمیدونم شما با کجای این روش مشکل دارید؟!!!

Behrouz_Rad
جمعه 27 شهریور 1388, 14:53 عصر
توضیح اضافه ای وجود نداره. موارد مبهمت رو در پست های قبلیم پیگیری کن.

موفق باشید.