PDA

View Full Version : سوال:لزوم امنیت در فرم هایی مانند تماس با ما . نظرات.



mokhtasatxyz
پنج شنبه 04 اردیبهشت 1393, 17:35 عصر
سلام
به نظر شما ایا برای فرم ها و صفحاتی مانند تماس با ما - ازسال نظرات و مانند اینها که فقط کاربر فیلد هایی مانند نام خانوادگی، موضوع و متن پیغام داشته باشد . و این اطلاعات امنیتی نیست لازم است از کد هایی مثلا mysql_escape_stringو یا اعتبار سنجی و یا جلوگیری از sql enjection استفاده کرد
من در این صفحات از کد تصاویر امنیتی استفاده کرده ام ایا کافی است؟
ممنون

omidabedi
پنج شنبه 04 اردیبهشت 1393, 18:34 عصر
سلام
به نظر شما ایا برای فرم ها و صفحاتی مانند تماس با ما - ازسال نظرات و مانند اینها که فقط کاربر فیلد هایی مانند نام خانوادگی، موضوع و متن پیغام داشته باشد . و این اطلاعات امنیتی نیست لازم است از کد هایی مثلا mysql_escape_stringو یا اعتبار سنجی و یا جلوگیری از sql enjection استفاده کرد
من در این صفحات از کد تصاویر امنیتی استفاده کرده ام ایا کافی است؟
ممنون

دوست عزیز شما هنوز درک درستی از امنیت ندارید
کاربر لزوما اون چیزی که برنامه نویس!شما در نظر دارید وارد این فرم هاتون نمیکنه پس همیشه و هرجا هر ورودی که از خارج میاد حالا میخواد هدر باشه میخواد url باشه یا همین فرمها باید اعتبار سنجی بشه
کد کپچا برای اینه که تشخیص بدی کسی که فرم فرستاده انسان هست پس نمیتونه کلی فرم رو ارسال کنه!به اصطلاح spamming کنه و بحثش با کنترل و اعتبارسنجی ورودی ها متفاوته.

پس هر ورودی که دریافت میکنید مطمئن شید که معتبر هست

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

برای نوع اول از تابع



mysql_real_escape_string();

//جلوگیری از باگ
sqlinjection و blindsql injection

و برای نوع دوم از تابع های


$new_code= strip_tags($string);
$new_code= htmlentities($string);

//$string رشتتونه که میخواید چکش کنید
//new_code هم ورودیتونه که چک شده و از کدهای مخرب پاک شده

//جلوگیری از باگ xss و rfi و ....

navid3d_69
جمعه 05 اردیبهشت 1393, 05:22 صبح
ببنید برای فرم هاتون سعی کنید اعتبار سنجی کنید مثلا اگر کاربر قرار شماره تلفن وارد کنه لازمم نیست که چیزه دیگه ای وارد بشه و شما می تونین خطا نمایش بدین

فرمها باید از نظر sqlinjection و xss و CSRF امن بشن

برای sqlinjection خودتون صحبت هایی کردین ولی بهتر هست آموزشی که توی همین بخش ارسال کردم رو بخونید و سعی کنید که از PDO استفاده کنید

XSS هم دوستمون توضیح دادن که اون هم باز توی همین بخش مقاله ای رو من قبل گذاشتم

برای CSRF باید از توکن استفاده کنید برای فرم ها و همیشه فرم هایی که تمامی کاربران می بینند و در درسترس عموم هستن رو از کد امنیتی هم استفاده کنید

mokhtasatxyz
جمعه 05 اردیبهشت 1393, 13:33 عصر
حالا میخواد هدر باشه میخواد url باشه یا همین فرمها باید اعتبار سنجی بشه

چگونه بفهمم در کد هایم از هدر و url استفاده شده و از طرف انها داده ای به فرم و کد هایم وارد شده؟


پس هر ورودی که دریافت میکنید مطمئن شید که معتبر هست

من برای فیلد هایی مانند radio , checbix , select, hidden از روش زیر استفاده کرده ام ایا کافی است؟ایا برای این نوع فیلد ها اعتبار سنجی نیاز است؟


if(!empty($_POST['sex_kj']))
{
if(preg_match('[1-2]', $_POST['sex_kj']))
{
$f=$_POST['sex_kj'];
$f=mysql_escape_string($f);
}
else
{
$valid=(int)0;
unset($_POST['sex_kj']);
}
}
else
$valid=(int)0;
و
insert $f to SQL query



برای نوع دوم از تابع های



$new_code= strip_tags($string);
$new_code= htmlentities($string);

//$string رشتتونه که میخواید چکش کنید
//new_code هم ورودیتونه که چک شده و از کدهای مخرب پاک شده

//جلوگیری از باگ xss و rfi و ....



می شود در مورد این دو تابع بیشتر توضیح دهید ؟چه داده هایی وارد این تایع می شود و چگونه از ان استفاده کنم؟
ممنون

navid3d_69
جمعه 05 اردیبهشت 1393, 15:29 عصر
شما مقداری که خودتون میدین رو جلوش int می گذارید که نیاز نیست چون مقدار ثابت هست و قابل تغییر نیست مقداری که از کاربر دریافت می کنین رو که باید عدد باش رو Int نمی گذارید خوب این باید برعکس باشه اون regex هم نیاز نیست با Int مشکل حل میشه

mokhtasatxyz
جمعه 05 اردیبهشت 1393, 15:30 عصر
می تونین خطا نمایش بدین

بهترین روش نمایش خطا چگونه است ؟ در کجای صفحه و کدام صفحه خطا را نمایش دهم؟ میتوانید یک نمونه کد برایم مثال بزنید؟


برای CSRF باید از توکن استفاده کنید

توکن چیست ؟

ضمنا لطفا لینک دو اموزشی که گفتید را برایم بگذارید.
ممنون

mokhtasatxyz
جمعه 05 اردیبهشت 1393, 15:47 عصر
اون regex هم نیاز نیست با Int مشکل حل میشه

در بخش های این انجمن نوشته اند که هکر میتواند فرمی را خود تولید کند که داده هایی را از روش post به فرمی ارسال(تزریق) کند. با این وجود به گفته شما برای داده هایی که باید حتما عددی باشند و یا در فرم قابلیت فقط انتخابی داشته باشند نیازی به اعتبار سنجی انها نیست .ایا اینطور است ؟من که این طور برداشت کردم:متفکر:

omidabedi
جمعه 05 اردیبهشت 1393, 16:01 عصر
تابع strip_tags میاد تگ های غیرمجاز رو پاک میکنه مثل تگ <script>
htmlentites هم میاد کارکترهای غیرمجاز رو خنثی میکنه مثل ; ' , و...
شما هرچیزی که از کاربر میگیری میزاری تو این تابع اینجوری



$info=strip_tags($_POST['etelaate karbar']);


بعضی مواقع شما بعضی اطلاعات رو به روش get میفرستی پس در url نمایش میده و قابل دستکاری هست.

بعضی اطلاعات هم از هدرمیگیری مثل HTTP_REFERER و بعد میخوای اینو ازش استفاده کنی و شاید هدر جعلی باشه پس باید چک بشه

برای توکن هم شما فرم ک میسازی یه رشته ساختگی و unique میسازی و بوسله ی یک hidden field میزاری یا اصلا میتونی از url بفرستی به صفحه ی مقصد

و همون رشته ی ساختگی رو با سشن میفرستی ب صفحه ی مقصد و مقایسه میکنی در نتیجه میشه از باگ csrf جلوگیری کرد

omidabedi
جمعه 05 اردیبهشت 1393, 16:02 عصر
در بخش های این انجمن نوشته اند که هکر میتواند فرمی را خود تولید کند که داده هایی را از روش post به فرمی ارسال(تزریق) کند. با این وجود به گفته شما برای داده هایی که باید حتما عددی باشند و یا در فرم قابلیت فقط انتخابی داشته باشند نیازی به اعتبار سنجی انها نیست .ایا اینطور است ؟من که این طور برداشت کردم:متفکر:

وقتی int میزاری یعنی میگی این متغییر عددی هست پس اگه عددی نباشه ارور میده پس داری اعتبار سنجی میکنی دیگه!

mokhtasatxyz
جمعه 05 اردیبهشت 1393, 16:44 عصر
بعضی اطلاعات هم از هدرمیگیری مثل HTTP_REFERER و بعد میخوای اینو ازش استفاده کنی و شاید هدر جعلی باشه پس باید چک بشه

برای چک کردن هدر و اعتبار سنجی ان باید چکارکنم؟



برای توکن هم شما فرم ک میسازی یه رشته ساختگی و unique میسازی و بوسله ی یک hidden field میزاری یا اصلا میتونی از url بفرستی به صفحه ی مقصد

و همون رشته ی ساختگی رو با سشن میفرستی ب صفحه ی مقصد و مقایسه میکنی در نتیجه میشه از باگ csrf جلوگیری کرد

من با توضیحات شما این را فهمیدم که یک فیلد hidden با مقدار یک رشته را در فرم بسازم و در کد های php خود این مقدار hidden را چک کنم ولی نفهمیدم ان رشته ساختگی را که در فرم طراحی کرده ام چگونه با سشن بفرستم ؟ایا در قسمت کد های طراحی فرم می شود به متغییر سشن مقدار داد ایا منظور شما نوشتن کدی شبیه به این است؟

< form action="" method="POST">
<?php $_SESSION['a'] ='3';?>
< /form>


ضمنا تمامی کد های فرم و php من در یک فایل است و از دو فایل جدا برای فرم و دستورات php استفاده نکرده ام

omidabedi
جمعه 05 اردیبهشت 1393, 17:56 عصر
برای چک کردن هدر و اعتبار سنجی ان باید چکارکنم؟



من با توضیحات شما این را فهمیدم که یک فیلد hidden با مقدار یک رشته را در فرم بسازم و در کد های php خود این مقدار hidden را چک کنم ولی نفهمیدم ان رشته ساختگی را که در فرم طراحی کرده ام چگونه با سشن بفرستم ؟ایا در قسمت کد های طراحی فرم می شود به متغییر سشن مقدار داد ایا منظور شما نوشتن کدی شبیه به این است؟

< form action="" method="POST">
<?php $_SESSION['a'] ='3';?>
< /form>


ضمنا تمامی کد های فرم و php من در یک فایل است و از دو فایل جدا برای فرم و دستورات php استفاده نکرده ام


دوست عزیز هرموقع نیاز به اطلاعت هدر داشتی باید هدر رو بگیری !!!
برای اعتبار سنجیشم گفتم قبلا بهتون اگر قراره از این اطلاعات در ساخت کوئری استفاده کنی باید mysql_real_escape_string و htmlentites بگذرونیشون
اگرم نه همون strip_tags و htmlentites

چیزهایی که میتونی بگیری از هدر و ...
http://ir2.php.net/manual/en/reserved.variables.server.php


برای توکن باید از یک رشته ی تصادفی استفاده کنی و بهتر است که اونو با md5 رمزنگاری کنی.
بهتر است از دو صفحه استفاده کنی.
یک صفحه فرم و دیگری برنامه ی php و .....



session_start();
$token = md5(uniqid(rand(),TRUE));
$_SESSION['token']= $token;


همین توکنی که ساختیمو توی hidden field همراه فرممون به صفحه ی دوم میفرستیم
اونجا چک میکنیم ایا سشن مقدار دهی شده(isset)؟اگر شده ایا برابر سشنی هست که توی hidden fieldمون هست؟اگر اره پس فرم از روی سایت خودمون submit شده و باگ csrf نداره

برای روش استفاده از سشن هم سرچ کنید

navid3d_69
شنبه 06 اردیبهشت 1393, 00:52 صبح
در بخش های این انجمن نوشته اند که هکر میتواند فرمی را خود تولید کند که داده هایی را از روش post به فرمی ارسال(تزریق) کند. با این وجود به گفته شما برای داده هایی که باید حتما عددی باشند و یا در فرم قابلیت فقط انتخابی داشته باشند نیازی به اعتبار سنجی انها نیست .ایا اینطور است ؟من که این طور برداشت کردم:متفکر:

برای اینکه درخواست ها فقط از همون فرم و همون صفحه ارسال بشه از توکن استفاده کنید این مشکل حل میشه

mokhtasatxyz
یک شنبه 07 اردیبهشت 1393, 17:16 عصر
از همه شما ممنونم که برای من وقت گذاشتید. کاملا توضیحات شما را فهمیدم و از ان استفاده نمودم.:تشویق:

mokhtasatxyz
جمعه 12 اردیبهشت 1393, 23:23 عصر
سلام
ببخشید یک سوال برایم پیش امد که مجبور شدم مجددا به این تاپیک سر بزنم
در استفاده از توکن اگر برسی شد و ان سشن وجود نداشت و در واقع داده ها از طریق فرم ما نیامده بود باید چکار کنم؟
ایا کاربر را به یک سایت دیگر ارجاء دهم؟
ایا تمامی متغییر ها و سشن ها را unset کنم؟
مرورگر را ببندم؟
__________________________________________________ _________________________
اصلا اگر در برسی داده برای کشف انواع نفوذها به بک اختلال و تناقض(نفوذ) برخورد نمودیم مانند مثال بالا یا باگ xss و rfi باید چکارهایی انجام دهیم؟
__________________________________________________ _____________________
راستی دستور exit دقیقا چکار می کند؟
ممنون

masiha68
شنبه 13 اردیبهشت 1393, 00:02 صبح
یه پیغام نمایش بده و بهش بگو برای ارسال از دگمه ارسال استفاده کن .... چون با رفرش مجدد صفحه بازم اطلاعات ارسال میشه و خطا میده و نمیشه به طور قطع گفت که این خطا صرفا به دلیل اینه که اطلاعات از یه فرم دیگه ای اومده
لزومی نداره مرور بسته بشه ! یا کاربر رو از سایت بندازی بیرون ....فقط یه پیغام کفایت می کنه . البته من معمولا این مواقع اطلاعات کاربر رو هم می گیرم و از طرق ایمیل به خودم اطلاع می دم که همچین اتفاقی افتاده ولی فقط جاهایی که حساسه مثل فرم لاگین سیستم ....
منظورتون از تناقض چیه ؟

navid3d_69
شنبه 13 اردیبهشت 1393, 09:56 صبح
دوست عزیز دقت کنید توکن رو برای لینک های مهم هم قرار بدین مثلا برای ثبت یک محصول یا اضاف کردن به سبد خرید یا حذف یک کامنت و قسمت های مهم ...