چند نکته در باب افزایش ضریب امنیت سایتهای طراحی شده با PHP
s: امنیت | تجربیات | تخصصی | وب امروزه پي اچ پي در حوزه طراحي وب جزء رايجترين ها محسوب مي شود و از آنجا که اين زبان برنامه نويسي يک زبان اسکريپتي است (زباني که مستقيماً اجرا نمي شود) ،اگر برنامه نويسان آن تجربه کافي نداشته باشند، حفره هاي گوناگون امنيتي مي تواند آنرا نفوذپذير کند. در زير چند نکته براي افزايش سايتهايي که از پي اچ پي استفاده مي کنند پيشنهاد مي شود : استفاده از قابليت نمايش خطا معمولاً هنگام توليد برنامه ، خاصيت Error_Reporting آنرا غيرفعال کرده و يا سطح امنيتي آنرا پائين مي آوريم که يکسره به هشدار و خطاهاي جزئي نمايش داده نشود . اما تنظيم درست اين خاصيت در فايل php.ini مي تواند مشکلات امنيتي آنرا قبل از عملياتي شدن به ما نمايش دهد. حداقل اينکه پس از اتمام فاز برنامه نويسي ، نمايش خطاها را به صورت کامل فعال مي کنيم ( error_reporting = E_ERROR & E_WARNING & E_PARSE & E_NOTICE ) و بعد برنامه را دوباره تست کرده، خطاهاي احتمالي را مجدداً رفع و رجوع مي کنيم. مقادير مختلف اين قابليت در خود فايل php.ini بيان شده است. اگر سرور متعلق به خودتان نيست و امکان تغيير در فايل php.ini را نداريد از فايل .htaccess (فايلي در پوشه اصلي سايت براي تنظيمات سرور با دسترسي کاربر)استفاده کنيد و با اضافه کردن اين دستور به فايل فوق ، مشکل را حل کنيد : php_value error_reporting 7 غيرفعالسازي قابليت هاي بالقوه خطرناک برخي از قابليت هاي تعبيه شده در پي اچ پي، مي توانند ضريب امنيت سايت شما را کاهش دهند و بهتر است از آنها يا استفاده نکنيد و يا کلاً آنها را غير فعال کنيد. از جمله اين قابليت ها مي توان به اين چند مورد اشاره کرد : Register Globals يکي از امکاناتي که براي راحتي برنامه نويس در پي اچ پي تعبيه شده است قابليت عمومي کردن متغيرهاي ارسالي فرمهاست که با دستور register_globals=On در فايل php.ini فعال مي شود با فعال شدن اين قابليت تمام متغيرهاي POST,Get,COOKIE,SERVER,... به صورت عمومي در مي آيند و به جاي نوشتن $_POST['name'] کافيست عبارت $name را به کار بريم. اين امر نوشتن برنامه ها را ساده تر مي کند اما باعث ايجاد رخنه هاي امنيتي در سيستم مي شود . مثلا کد زير را در نظر بگيريد : i f( !empty( $_POST['username'] ) && $_POST['username'] == ‘test123? && !empty( $_POST['password'] ) && $_POST['password'] == “pass123? ) { $access = 1; } حال اگر کاربر به انتهاي آدرس صفحه جاري عبارت access=1 را به صورت دستي اضافه کند، از آنجا که اين متغير به صورت عمومي به سرور ارسال مي شود ، سمت سرور خواهيم داشت $access = 1 و کاربر خواهد توانست به سيستم بدون داشتن رمز عبور وارد شود. اگر سرور متعلق به خودتان نيست و امکان تغيير در فايل php.ini را نداريد از فايل .htaccess استفاده کنيد و با اضافه کردن اين دستور به فايل فوق ، مشکل را حل کنيد : php_flag register_globals 0 Magic Quotes براي نمايش گيومه (تکي و دوتايي ) به کاربر معمولاً از علامت \ قبل از گيومه استفاده مي کنيم . حال اگر در برنامه به اين کار زياد نياز داشته باشيم، از " گيومه هاي جادويي " که در پي اچ پي به اين منظور تعبيه شده اند استفاده مي کنيم تا کار برنامه نويسي را راحت کنند اما اين قابليت هم نفوذپذيري سايت را بالا مي برد و بهتر است غير فعال شود : 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 بررسي ورودي هاي کاربر از آنجا که مي دانيد براي هر کدام از فيلدهاي فرم ، چه نوع داده هايي مجاز هستند، کاري کنيد که کاربر داده غير مجاز اصلاً نتواند وارد کند. (به کمک جاوا اسکريپت و نيز هنگام پردازش داده ) عدم پذيرش کدهاي HTML در ورودي فرم ها تا جاييکه امکان دارد اجازه ندهيد کاربر کد HTML به عنوان ورودي فرم وارد کند چون اين امر باعث مي شود يک هکر با ارسال کدهاي جاوااسکريپت از اين طريق ، سايت شما را مورد حمله قرار دهد و به آن نفوذ کند. ( Cross Site Scripting Attacks ) محافظت از بانک اطلاعاتي و جلوگيري از تزريق SQL اگر ورودي کاربر را مستقيماً به بانک اطلاعاتي ارسال کنيد، باعث مي شويد هکر محترم با افزودن کدهايي به ورودي ، به راحتي به بانک اطلاعاتي شما نفوذ کند و يا اقدامات امنيتي شما را دور بزند. براي مثال فرض کنيد شما در برنامه خود کد زير را نوشته ايد mysql_query( “SELECT * FROM tbl_employee WHERE username = '".$GET['username']."' " حال اگر کاربر به جاي نام کاربري عبارت Ali or 1=1 را وارد کند نتيجه شرط sql همواره درست خواهد بود و کاربر به راحتي وارد سايت شما خواهد شد . براي حل اين مشکل کافيست قبل از ارسال داده هاي فرم به بانک اطلاعاتي ، از شکل صحيح ورود آنها مطمئن شويد مثلاً اين کد را به کار بريد : $username = mysqli_real_escape_string( $GET['username'] ); mysql_query( “SELECT * FROM tbl_employee WHERE username = '".$username."' " ; فهرست فوق تنها نکات اصلي امنيتي در پي اچ پي است و مطمئناً نکات امنيتي که بايد به عنوان برنامه نويس پي اچ پي رعايت کنيد بسيار بيشتر از فهرست فوق است .