1:از کار انداختن نمایش خطاها
بهتر این است Ú©Ù‡ بعد از کار کد نویسی ،تست Ùˆ دیباگ از نمایش خطاهایی Ú©Ù‡ ممکن است در مراØÙ„ اجرای اسکریپت رخ بده جلوگیری کنید تا مانع سواستÙاده های اØتمالی بشید .
بهترین روش برای این کار استÙاده از دستور زیر در خط اول اسکریپت هاست
2:از کار انداختن تنظیمات بد php
یکی از بهترین خصوصیات phpاین است Ú©Ù‡ شما Ù…ÛŒ توانید بدون تعری٠متغیر ها ازشون استÙاده کنید ØŒ این یکی از Ù…Øبوبترین قابلیت های php هست اما اگر این قابلیت با register_global ترکیب بشه Ù…ÛŒ تواند یک مشکل امنیتی در برنامه ها ایجاد کنه
به کد زیر نگاه کنید این کد بعد تر اعتبار سنجی نام کاربری و پسورد اجازه دسترسی به بخش های دیگه رو میده
خوب این اسکریپت کوچیک شاید از نظر یک برنامه نویس باتجربه بدون عیب به نظر برسه اما در واقع دارای یک باگ امنیتی هست ،توی شبکه در خواست **ی که می خواد لوگین کنه به صورت زیر ارسال میشه :
http://www.yoursite.tld/test.php=use...ssword=test123
خوب این ورودی ها Ú©Ù‡ به برنامه برسه Ùایل secret.html را اینکلود میکنیم.
مشکل اینجاست Ú©Ù‡ یوزر Ùقط Ù…Øدود به Ùرستادن اسم زمر Ùˆ کلمه عبور نیست Ùˆ Ù…ÛŒ تواند هرچیزی را Ú©Ù‡ بخواهد به رشته در خواست اضاÙÙ‡ کند .یک مثال در این زمینه به صورت زیر هست :
http://www.yoursite.tld/test.php?username?access=1
Øالا اگر **ÛŒ این برنامه رو به صورت بالا درخواست کنه دستور if($access == 1) مساوی true مشه Ùˆ صÙØÙ‡ ÛŒ Ù…Øرمانه را نمایش میده
راه اول مقابله با این مشکل مقدار دهی اولیه متغیر هاست
راه دوم ازکارانداختن register_global است
متاسÙا نمیشه با شبه دستور ini_set بر روی register_global تغییری ایجاد کرد Ùˆ باید با Ùایل های .htaccess Ùˆ php.ini برای سایت Ùˆ Ùولدر های موجود در سایت این دستور را از کار انداخت
دستورات زیر را Ù…ÛŒ توانید در Ùایل های مورد نظر بنویسبد
Magic Quotes (magic_quotes_gpc, magic_quotes_runtime, magic_quotes_sybase)
این دستور هم برای کنترل اسلش به Øرو٠معنی دار مانند تک کوتیشن (') Ùˆ دوتا کوتیشن (")هاست Ú©Ù‡ مانند بالا باید با استÙاده از .htaccess Ùˆ php.ini تنظیمش کرد
3:درستی ورودی های کاربر
معمولا بیشترین Øمله ها به برنامه های تØت وب از طر٠Ùرم ها یی است Ú©Ù‡ تعامل بین برنامه با یوزر رو ایجاد Ù…ÛŒ کنه همیشه باید ورودی ها رو به طور دقیق Ú†Ú© کرد مثلا در مثال زیر با استÙاده از تابع preg_match ورودی ها رو Ú†Ú© Ù…ÛŒ کنیم Ùˆ در صورتی Ú©Ù‡ طبق Ùرمولی Ú©Ù‡ ما Ù…ÛŒ خواستیم نبود پیام خطایی صادر Ù…ÛŒ کند
4: Cross Site ******ing (XSS) های اضاÙÙ‡ شده همراه ورودی
روش های ایجاد این نوع باگ خیلی زیاد هست Ùˆ همش بر Ù…ÛŒ گرده به هنر Ù†Ùوذگر Ùˆ Ù…ÛŒ تونه روش های متÙاوتی داشته باشه اما برای جلوگیری از بروز این نوع مشکلات یکی از بهترین روش ها استÙاده از bbtag ها یا bb code هاست Ú©Ù‡ یک تگ خود شما به دلخواه Ù…ÛŒ گذارید سپس با استÙاده از ریپلیس کردن تگ شما با تگ اصلی در html اونرو به Øالت اصلی برگردانید
5:Ù…ØاÙظت در برابر SQL Injection
همانطور Ú©Ù‡ Ù…ÛŒ دانید دستورات ورود Ùˆ خروج اطلاعات از دیتابیس با استÙاده از Ùرمان های زبان SQL نوشته Ù…ÛŒ شود این دستور را مابین " یا ' قرار Ù…ÛŒ دهیم Ùˆ برای اجرا به تابع مجری Ù…ÛŒÙرستیم Øالا اگر همراه یکی از متغیر هایی Ú©Ù‡ قرار در SQL مورد نظر ادقام بشه یک " یا ' اضاÙÛŒ باشه Øالت اتمام رشته رو بهم میزنه Ùˆ میشه از این طریق دستوراتی Ú©Ù‡ مد نظر برنامه نویس نبوده رو اجرا کرد Ùˆ به اطلاعات Ù…Øرمانه درون دیتابیس رسید مثلا Ùرض کنید ' OR 1=1 را همراه یک کوئری Ú©Ù‡ یوزر Ùˆ پسورد را Ú†Ú© Ù…ÛŒ کند بÙرستیم .نتیجه رو Øتما Ù…ÛŒ تونید Øدث برنید!
یکی از توابعی Ú©Ù‡ برای جلوگیری از همچین مشکلاتی استÙاده Ù…ÛŒ شود تابع : mysqli_real_escape_string هست Ú©Ù‡ در زیر یک مثال از آن را Ù…ÛŒ بینید
نکته : توابع Ùˆ راه ØÙ„ های زیادی در Ú©Ù„ این 5 مشکل وجود دارند Ú©Ù‡ به یاری برنامه نویس میرسند اما من به آنها اشاره نکردم چون از Øوصله مقاله خارج بود
بهتر این است Ú©Ù‡ بعد از کار کد نویسی ،تست Ùˆ دیباگ از نمایش خطاهایی Ú©Ù‡ ممکن است در مراØÙ„ اجرای اسکریپت رخ بده جلوگیری کنید تا مانع سواستÙاده های اØتمالی بشید .
بهترین روش برای این کار استÙاده از دستور زیر در خط اول اسکریپت هاست
کد:
error_reporting(0);
2:از کار انداختن تنظیمات بد php
یکی از بهترین خصوصیات phpاین است Ú©Ù‡ شما Ù…ÛŒ توانید بدون تعری٠متغیر ها ازشون استÙاده کنید ØŒ این یکی از Ù…Øبوبترین قابلیت های php هست اما اگر این قابلیت با register_global ترکیب بشه Ù…ÛŒ تواند یک مشکل امنیتی در برنامه ها ایجاد کنه
به کد زیر نگاه کنید این کد بعد تر اعتبار سنجی نام کاربری و پسورد اجازه دسترسی به بخش های دیگه رو میده
کد:
if( !empty( $_POST['username'] ) && $_POST['username'] == 'test' && !empty( $_POST['password'] ) && $_POST['password'] == "test123" ) { $access = 1; } If ($access == 1) { Include "secret.html"; }
خوب این اسکریپت کوچیک شاید از نظر یک برنامه نویس باتجربه بدون عیب به نظر برسه اما در واقع دارای یک باگ امنیتی هست ،توی شبکه در خواست **ی که می خواد لوگین کنه به صورت زیر ارسال میشه :
http://www.yoursite.tld/test.php=use...ssword=test123
خوب این ورودی ها Ú©Ù‡ به برنامه برسه Ùایل secret.html را اینکلود میکنیم.
مشکل اینجاست Ú©Ù‡ یوزر Ùقط Ù…Øدود به Ùرستادن اسم زمر Ùˆ کلمه عبور نیست Ùˆ Ù…ÛŒ تواند هرچیزی را Ú©Ù‡ بخواهد به رشته در خواست اضاÙÙ‡ کند .یک مثال در این زمینه به صورت زیر هست :
http://www.yoursite.tld/test.php?username?access=1
Øالا اگر **ÛŒ این برنامه رو به صورت بالا درخواست کنه دستور if($access == 1) مساوی true مشه Ùˆ صÙØÙ‡ ÛŒ Ù…Øرمانه را نمایش میده
راه اول مقابله با این مشکل مقدار دهی اولیه متغیر هاست
راه دوم ازکارانداختن register_global است
متاسÙا نمیشه با شبه دستور ini_set بر روی register_global تغییری ایجاد کرد Ùˆ باید با Ùایل های .htaccess Ùˆ php.ini برای سایت Ùˆ Ùولدر های موجود در سایت این دستور را از کار انداخت
دستورات زیر را Ù…ÛŒ توانید در Ùایل های مورد نظر بنویسبد
کد:
Disabling with .htaccess php_flag register_globals 0 Disabling with php.ini register_globals = Off
این دستور هم برای کنترل اسلش به Øرو٠معنی دار مانند تک کوتیشن (') Ùˆ دوتا کوتیشن (")هاست Ú©Ù‡ مانند بالا باید با استÙاده از .htaccess Ùˆ php.ini تنظیمش کرد
کد:
Disabling with .htaccess php_flag magic_quotes_gpc 0 php_flag magic_quotes_runtime 0 Disabling with php.ini magic_quotes_gpc = Off magic_quotes_runtime = Off magic_quotes_sybase = Off
معمولا بیشترین Øمله ها به برنامه های تØت وب از طر٠Ùرم ها یی است Ú©Ù‡ تعامل بین برنامه با یوزر رو ایجاد Ù…ÛŒ کنه همیشه باید ورودی ها رو به طور دقیق Ú†Ú© کرد مثلا در مثال زیر با استÙاده از تابع preg_match ورودی ها رو Ú†Ú© Ù…ÛŒ کنیم Ùˆ در صورتی Ú©Ù‡ طبق Ùرمولی Ú©Ù‡ ما Ù…ÛŒ خواستیم نبود پیام خطایی صادر Ù…ÛŒ کند
کد:
if ( ! preg_match( "/^[0-9]{1,2}$/", $_GET['month'] ) ) { // handle error } if ( ! preg_match( "/^[0-9]{1,2}$/", $_GET['day'] ) ) { // handle error } if ( ! preg_match( "/^[0-9]{4}$/", $_GET['year'] ) ) { // handle error }
4: Cross Site ******ing (XSS) های اضاÙÙ‡ شده همراه ورودی
روش های ایجاد این نوع باگ خیلی زیاد هست Ùˆ همش بر Ù…ÛŒ گرده به هنر Ù†Ùوذگر Ùˆ Ù…ÛŒ تونه روش های متÙاوتی داشته باشه اما برای جلوگیری از بروز این نوع مشکلات یکی از بهترین روش ها استÙاده از bbtag ها یا bb code هاست Ú©Ù‡ یک تگ خود شما به دلخواه Ù…ÛŒ گذارید سپس با استÙاده از ریپلیس کردن تگ شما با تگ اصلی در html اونرو به Øالت اصلی برگردانید
5:Ù…ØاÙظت در برابر SQL Injection
همانطور Ú©Ù‡ Ù…ÛŒ دانید دستورات ورود Ùˆ خروج اطلاعات از دیتابیس با استÙاده از Ùرمان های زبان SQL نوشته Ù…ÛŒ شود این دستور را مابین " یا ' قرار Ù…ÛŒ دهیم Ùˆ برای اجرا به تابع مجری Ù…ÛŒÙرستیم Øالا اگر همراه یکی از متغیر هایی Ú©Ù‡ قرار در SQL مورد نظر ادقام بشه یک " یا ' اضاÙÛŒ باشه Øالت اتمام رشته رو بهم میزنه Ùˆ میشه از این طریق دستوراتی Ú©Ù‡ مد نظر برنامه نویس نبوده رو اجرا کرد Ùˆ به اطلاعات Ù…Øرمانه درون دیتابیس رسید مثلا Ùرض کنید ' OR 1=1 را همراه یک کوئری Ú©Ù‡ یوزر Ùˆ پسورد را Ú†Ú© Ù…ÛŒ کند بÙرستیم .نتیجه رو Øتما Ù…ÛŒ تونید Øدث برنید!
یکی از توابعی Ú©Ù‡ برای جلوگیری از همچین مشکلاتی استÙاده Ù…ÛŒ شود تابع : mysqli_real_escape_string هست Ú©Ù‡ در زیر یک مثال از آن را Ù…ÛŒ بینید
کد:
$username = mysqli_real_escape_string( $GET['username'] ); mysql_query( "SELECT * FROM tbl_members WHERE username = '".$username."'");
Comment