PDA

View Full Version : ورودی فقط متن !!!



merlin_vista
دوشنبه 19 آذر 1386, 18:50 عصر
آقا من یک قسمت تو سایت درست کردم که کاربر به وسیله یک textBox بتونه نظر بنویسه و نظر ایشون تو دیتابیس ذخیره میشه . :لبخندساده:
حالا مشکل من اینه که اگه کاربر در textBox متنی به غیر از نوشته به عنوان مثال (کدهای HTML , کدهای java script و ;کدهای VBscript بنویسه یا هر چیز دیگه برنامه خطا میده !! :گیج: ) .

حالا چگونه جلوی یوزر را بگیرم که فقط بتونه متن وارد کنه :ناراحت: خلاصه اگه تجربه ای تو این ضمینه دارید بگید :چشمک:

mahdi_farhani
دوشنبه 19 آذر 1386, 18:59 عصر
بارها گفتم ، FilteredTextBox و اونو بزار روی Custom و ValidChar بده و
البته راه های زیادی هست . اینم یه روش
از توابع جاوا اسکریپت هم میتونی استفاده کنی .

merlin_vista
دوشنبه 19 آذر 1386, 19:10 عصر
ممنون از کمک شما !!
ببین مثلاً شما کد زیر را در قسمت نظرات برای دیتابیس من ارسال میکنید !


<p style="color:maroon">Command</p>
حالا برنامه به شما خطا میده !

خوب اینجا FilteredTextBox جوابگو نیست چون ما باید جلوی تمام تگ های HTML و JAVA script را بگیریم که این کار فیر ممکنه !! آیا راهی دیگه به نظراتون میرسه !!

مثلاً سایت بلاگفا در قسمت نظرات وبلاگ ها اگه مثلا یه کد HTML را ارسال کنی برنامه میاد عین آن کد را در دیتابیس ذخیره میکنه ! بدون خطا و بعد در هنگام نمایش ، عین آن کد را به شما نمایش میده بدون آن که آن کد اجرا بشه !!

امیدوارم منظورم را فهمیده باشید ؟!

abolfazl585
دوشنبه 19 آذر 1386, 19:48 عصر
فکر کنم فهمیدم مشکل شما چیه.
ببین دوست عزیز:
وقتی که متن وارد شده در باکس دارای کوتیشن باشه این احتمال وجود داره که با کوتیشن های داخل خط های برنامه قاطی بشه و یک دستور Sqlی تولید میشه که شما قصد ایجاد اون رو نداشتید.
بهره که تو Insert هاتون از Parameters استفاده کنین تا عینا عبارت باکس بره تو فیلد


Insert into table1 values(@name)
مثال
کد:

"Insert into table1 values('"+TextBox1.text+"')"
حالا اگه کاربر تو باکس بنویسه:ali'reza
این خط کدی که نوشته بودین میشه:


Insert into table1 values('ali'reza')

و این یعنی Syntax Error

egoldashraf
دوشنبه 19 آذر 1386, 21:08 عصر
شما میخواهید اطلاعات رو بصورت کد های html ذخیره کنید و خطا دریافت نکنید یا میخواهید که جلوی ورود این کدها رو بگیرید؟

mahdi_farhani
دوشنبه 19 آذر 1386, 21:27 عصر
اگر منظورت جلوگیری از Injection هست ( SQL,Xss ) کافی فقط کلمات کلیدی رو فیلتر کنی ، به این صورت که برای SQL ;-*/=و هزچیزی که خودت بهتر میدونی و برای XSS ( اگر اشتباه نگم ، منظورم همون حملاتی که با دستور Java میشه کوکی ها و .. خوند ) میتونی :<>/ و ... فیلتر کنی و با FilteredTextbox میشه اینکارو کرد ولی بازم بیشتر توضیح بده تا بیبینم چیکار میشه کرد .
------

حالا اگه کاربر تو باکس بنویسه:ali'reza
این خط کدی که نوشته بودین میشه:

کد:
Insert into table1 values('ali'reza')و این یعنی Syntax Error
در ضمن در جواب دوستمون بگم که اگر از Stored Procedure استفاده کنی ، دیگه اینکارو نمیتونه بکونه و خطایی نمیده و ..... ....

Behrouz_Rad
دوشنبه 19 آذر 1386, 21:47 عصر
مشکل من اینه که اگه کاربر در textBox متنی به غیر از نوشته به عنوان مثال (کدهای HTML , کدهای java script و ;کدهای VBscript بنویسه یا هر چیز دیگه برنامه خطا میده !!

ValidateRequest رو در دایرکتیو Page برابر با false قرار بده.



مثلاً سایت بلاگفا در قسمت نظرات وبلاگ ها اگه مثلا یه کد HTML را ارسال کنی برنامه میاد عین آن کد را در دیتابیس ذخیره میکنه ! بدون خطا و بعد در هنگام نمایش ، عین آن کد را به شما نمایش میده بدون آن که آن کد اجرا بشه !!

از متد HtmlEncode کلاس HttpUtility استفاده کن.


اگر منظورت جلوگیری از Injection هست ( SQL,Xss ) کافی فقط کلمات کلیدی رو فیلتر کنی ، به این صورت که برای SQL ;-*/=و هزچیزی که خودت بهتر میدونی و برای XSS ( اگر اشتباه نگم ، منظورم همون حملاتی که با دستور Java میشه کوکی ها و .. خوند )

در تعیین اعتبار ورودی نباید فقط به کدهای سمت کلاینت بسنده کنید.
کدهای سمت کلاینت به راحتی قابل حذف شدن هستند!
از حملات XSS به راحتی میشه با کد کردن ورودی با استفاده از متد HtmlEncode جلوگیری کرد. همیشه باید این کار رو بکنید.

موفق باشید.

mahdi_farhani
دوشنبه 19 آذر 1386, 22:02 عصر
آقا بهروز ممنون میشه درمورد HTMLEncode توضیحی یا منبعی بدید .

abolfazl585
دوشنبه 19 آذر 1386, 22:25 عصر
در ضمن در جواب دوستمون بگم که اگر از Stored Procedure استفاده کنی ، دیگه اینکارو نمیتونه بکونه و خطایی نمیده
جناب آقای فرهانی اگه پست من رو دقیق میخوندین ، من گفته بودم از Parameter استفاده کنه تا اینجور مشکلات پیش نیاد


اگر منظورت جلوگیری از Injection هست ( SQL,Xss ) کافی فقط کلمات کلیدی رو فیلتر کنی ، به این صورت که برای SQL ;-*/=و هزچیزی که خودت بهتر میدونی و برای XSS ( اگر اشتباه نگم ، منظورم همون حملاتی که با دستور Java میشه کوکی ها و .. خوند ) میتونی :<>/ و ... فیلتر کنی و با FilteredTextbox میشه اینکارو کرد
دوست عزیز اصلا نیازی به این کارها نیست. چرا وقت خودتون رو صرف این کارها میکنید.
در جواب همه دوستان باید بگم که وقتی از StoredProcedure ها و Parameter ها بصورت صحیح و استاندارد استفاده بشه اصلا Injectionی نمی تونه اتقاق بیفته.
پیشنهاد میکنم که مقالات زیر رو بخونید:
http://www.iran4me.com/Amozesh-Computer/2857.asp?q=%D8%AC%D9%84%D9%88%DA%AF%D9%8A%D8%B1%D9 %8A+%D8%A7%D8%B2+%D8%AD%D9%85%D9%84%D8%A7%D8%AA+SQ L+Injection+%D8%AF%D8%B1+ASPNET
ویا
http://www.unixwiz.net/techtips/sql-injection.html
ویا
http://www.youtube.com/watch?v=MJNJjh4jORY




موفق باشید

merlin_vista
دوشنبه 19 آذر 1386, 22:30 عصر
از تمام دوستانی که کمک کردن و جواب دادن نهایت تشکر را دارم !
فکر میکنم مشکل کن با جواب دادن آقای راد در مورد HTMLEncode و طرز استفاده از آن حل بشه !

Behrouz_Rad
دوشنبه 19 آذر 1386, 22:32 عصر
آقا بهروز ممنون میشه درمورد HTMLEncode توضیحی یا منبعی بدید .
بله. MSDN
......

merlin_vista
دوشنبه 19 آذر 1386, 22:39 عصر
آقای من برای تست اینجوری نوشتم :

string a = HttpUtility.HtmlEncode(this.TextBox1.Text);
this.Label1.Text = HttpUtility.HtmlDecode(a);
ولی همان پیغام قبلی را میده !!


A potentially dangerous Request.Form value was detected from the client (TextBox1="<p style="color:blu...").

abolfazl585
دوشنبه 19 آذر 1386, 22:50 عصر
شما یک بار Encode کردین و یک بار Decode ، یعنی هیچ کار نکردین.

Behrouz_Rad
دوشنبه 19 آذر 1386, 23:11 عصر
@merlin_vista
یک بار دیگه با دقت هر چه تمام تر پست من در صفحه ی قبل رو مطالعه کن.

موفق باشی.

merlin_vista
سه شنبه 20 آذر 1386, 07:29 صبح
با تشکر از تمام دوستان مشکل حل شد !
به این صورت که آقای راد گفت نوشتم :

ValidateRequest="false"

protected void Button1_Click1(object sender, EventArgs e)
{
string a = HttpUtility.HtmlEncode(this.TextBox1.Text);
this.Label1.Text = a.ToString();
}