امنیت بالای سایت های php به چه دلیل است؟
زبان PHP یک زبان اسکریپتی می باشد که مشهورترین و محبوب ترین زبان در بین برنامه نویسان زبان PHP است و خیلی ها برای امنیت سایت خود از php استفاده می کنند.
زبان PHP یک زبان اسکریپتی است که مورد استفاده به عنوان زبان عمومی و همچنین طراحی وب است. طبق تحقیقاتی که انجام شده، گزارشات نشان داده که مشهورترین و محبوب ترین زبان در بین برنامه نویسان زبان PHP است. یکی از مباحث مهم در زبان PHP، محافظت در برابر هکرها و حملات سایت ها و برنامه هایی است که با این زبان نوشته و طراحی شده اند؛ در ادامه به برخی نکات برای جلوگیری از حملات و امنیت در زبان php اشاره خواهیم کرد.
زبان PHP
کلمه php از عبارت Hypertext PreProcessor آمده که به معنای پیش پردازنده فرا متن است. زبان php از لحاظ ساختاری بسیار شبیه به زبان C است و در نسخه هایی که جدیدا منتشر شده به زبان جاوا شبیه است. کدهای زبان php برخلاف زبان های HTML و جاوااسکریپت، در سرور وب هاست اجرا میشود (کدهای HTML و جاوااسکریپت با استفاده از مرورگر کاربر قابل اجراست).
آموزش مرتبط: آموزش php
برنامه های ساخته شده با زبان PHP
به دلیل امنیت سایت های PHP نرم افزار و سایت های زیادی بر اساس آن نوشته شده اند. از نرم افزارهای معروفی که با زبان php ساخته شده میتوان به جوملا، WikiMedia و یا Mambo اشاره کرد. در دنیای وب نیز بسیاری از سایت ها بر اساس زبان php نوشته شده است. زبان php دستورات ساده ای را فراهم کرده که میتوان در انواع پایگاه داده از آن ها استفاده کرد مانند: MySQL، اوراکل، IBM DB۲ Microsoft SQL Server ،PostgreSQL و SQLite و این یکی از ویژگی های مهم زبان php است. یکی از دلایل معروفیت این زبان، قابلیت اجراشدن با بیشتر کارگزارهای معروف و همین طور روی بیشتر سیستم عامل ها مانند لینوکس، یونیکس، ویندوز و Mac OSX را دارد.
مزیت های زبان PHP
-
Php یک زبان opensource و رایگان است به همین دلیل یکی از مزیت های این زبان این است که هاست هایی که قابلیت اجرای میزبانی php را دارند نسبت به هاست های .NET بسیار مقرون به صرفه تر هستند.
-
از مزیت های دیگر زبان php این است که در پلتفرم های معروفی مانند Windows , Linux و ios اجرا میشود و این خیلی خوب است.
-
آموزش زبان php زبان ساده و یادگیری آن پیچیده نیست.
امنیت در زبان php
- استفاده از رمزنگاری پرقدرت
یکی از الگوریتم های محبوبی که امروزه توسط برنامه نویسان php استفاده میشود، الگوریتم MD5 است که در زیر به تابع آن اشاره شده:
$hash = md5($password);
برای رمزنگاری قدرتمند خیلی نمیتوان به تابع md5 کاربران برای اعمال رمزنگاری بیشتر از رمزهای 5 الی 6 کاراکتری استفاده میکنند که این رمز با توجه به ساده بودن و پیچیدگی خاصی نداشتن با استفاده از یک حمله brute-force جستجوی فراگیراعتماد کرد، به سادگی رمزگشایی میشود و در برخی موارد هم نیازی به حمله brute-force نمیباشد؛ این را هم در نظر داشته باشید که فقط با داشتن یک رمز پیچیده نمیتوانید به امنیت رمز خود اعتماد کنید به همین دلیل برنامه نویسان برای حل مشکلات امنیت رمز از تکنیک نمک زدن به پسورد استفاده میکنند؛ در این روش یک عبارت نامفهوم به صورت تصادفی تولید شده و قبل از رمزنگاری به پسورد اضافه میشود.
در روش اضافه کردن نمک به پسورد در واقع طول آن زیاد شده و پسورد پیچیده شده و از حالت سادگی در می آید و در زمان حمله جستجوی فراگیر، زمان لازم برای پیدا کردن رمز مورد نظر به شدت افزایش پیدا کرده و حتی غیر قابل انجام است.
$salt = 'SUPER_SALTY'; $hash = md5($password . $salt);
سعی شود در کنار استفاده از الگوریتم های نمک پاشی، از الگوریتم های رمزنگاری طولانی تری مانند؛ sha1 ،sha2 و … استفاده شود که زمان مورد نیاز برای حملات جستجوی فراگیر را افزایش میدهد.
تابع دیگری برای رمزنگاری وجود دارد که آن تابع crypt است؛
//string crypt ( string $str [, string $salt ] ) crypt('FoadTahmasebi', '$2a$07$usesomesillystringforsalt$') $user->password = sha1(md5($password);
محافظت در مقابل درخواست های جعلی
CSRF که مخفف Cross Site Request Forgery و به معنی این است که از سایت های دیگر درخواست های جعلی فرستاده میشود؛ این مشکل یکی از آسیب های نامشخص است که به عنوان یک مشکل در نظر گرفته نمیشود. در واقع در این مشکل، سرور قادر نیست به درستی تشخیص دهد که آیا کاربر خودش لینک url را فراخوانی کرده یا نه؛ به همین دلیل باید از تکنیک یا مکانیسم خاصی استفاده شود یعنی زمانی که کاربر عملیات مهمی را روی پایگاه داده انجام میدهد باید از کاربر تاییدیه گرفته شود یا سرویسی فعال شود که هر درخواست کلیکی شناسایی شود به همین جهت از فرم ها استفاده میشود چون میتوانند فیلدهای مخفی با یک عبارت تصادفی را در session نگه دارند و برای تشخیص و شناسایی به کار برده شوند. کد مربوط به آن:
session_start(); $token = md5(uniqid(rand(), TRUE)); $_SESSION['token'] = $token;
با نوشتن کد بالا، هکر با اجرای درخواست از طرف کاربر واقعی، حمله به موفقیت نخواهد رسید.
برای هر کاربر یک نشست
سایت هایی که دارای اطلاعات محرمانه هستند و اطلاعات سری رد و بدل میکنند مانند فروشگاه ها، برای اینکه مطمئن شوند که یک کاربر از دو محل وارد برنامه نشده باشد، اگر کاربری از محل دوم به برنامه وارد شود، کاربری که در محل اول است به شکل خودکار از برنامه خروج پیدا میکند. ذخیره کردن اطلاعات نشست در پایگاه داده و پیاده سازی آن کار سختی نیست و فقط باید در هر ورود در پایگاه داده، اطلاعات مربوط به ورود قبلی کاربر را حذف کرد.
نگهداری فایل ها و منابع مهم خارج از دایرکتوری WEB_ROOT
در زمانی که برنامه روی هاست اجرا میشود در حالت عادی، محل نگهداری فایل ها در پوشه زیر است؛
/var/www/
OR
/home/username/www/
همه اطلاعات مربوط به دسترسی داشتن به url درپوشه www ذخیره و نگهداری میشود و مابقی در پوشه خارج از آن انتقال داده میشود تا قابلیت دسترسی برای عموم را نداشته باشد مانند فایل هایی که در بردارنده برقراری اطلاعات هستند و یا دیگر فایل ها.
فایل های زبان PHP که توسط مرورگر فراخوانی میشود در مسیر زیر ذخیره میشود؛
/var/www/
و بقیه فایلها در:
/var/outside/
حال دیگر فایل ها قابلیت نمایش داده شدن ندارند و حتی اگر لیست محتویات دارکتوری ها هم فعال باشد.
غیر فعال کردن گزینه display_errors در فایل php.ini
به دلیل امنیت بالای سایت های PHP، برای هر دایرکتوری سطح و عمل جداگانه ای تعریف می شود، چرا؟ خطاها پیش از اینکه اسکریپت به صورت کامل اجرا شود، اتفاق می افتند و تحت فرمان هیچ دستوری نیستند؛ به همین دلیل در زمان ایجاد خطا، اطلاعات به صورت کامل نمایش داده میشود و نباید آن ها را در محیط انتشار نمایش داد. برای دایرکتوری ها سطوح دسترسی مناسبی تعیین شود. سطح دسترسی هر دایرکتوری با توجه به نیاز خواندن و نوشتن یک فابل باید به دستی انتخاب شود؛ البته باید برای هر عملی باید دایرکتوری جداگانه ای تعریف شود و سطح آن نیز مشخص شود به طور مثال دایرکتوری های مهمی مانند فایل های هسته ای یا فایل های کتابخانه ای باید مطمئن شوید که قابل نوشتن نباشد.
محدود کردن داده ها به فایل index.php
در زبان PHP مدرن، تنها نقطه برای ورود و اتصال به کل سایت، فایل index.php میباشد که سرور وب شما به دایرکتوری آن اختصاص داده میشود. فایل های پیکربندی شده نباید در وبسایت قرار داده شود زیرا سرور آن ها را به صورت عمومی نشان میدهد و تنها پرونده هایی شامل جاوا اسکریپت، CSS و تصویری باید در این فایل قرار بگیرد. برای ذخیره کردن گذرواژه از رمز عبور استفاده کنید. هیچ گاه از متن ساده برای ذخیره و نگه داری پسورد استفاده نکنید. الگوریتم هایی وجود دارد که برای تبدیل گذرواژه، از الگوی درهم سازی استفاده میکنند. یکی از راه های موفقیت آمیز، استفاده از تابع hash در زبان PHP است.
مقاله مرتبط: آخرین ورژن php را بشناسید!
رمزنگاری همه ارتباطات
در زبان PHP ارتباط با خدمات و مکانیسم های ذخیره سازی باید برقرار شود که این نوع اتصالات باید رمزنگاری شده باشند. در صوت استفاده نکردن از اتصالات امن، امکان انتشار داده ها روی شبکه وجود دارد. Tls از راه های تایید نشان اینترنتی است که ارسال داده ها را با امنیت روبه رو خواهد کرد.
نمونه باگ و راه حل آن
گاهی اوقات در برنامه نویسی ضعف هایی وجود دارد که باعث به وجود آوردن مشکلات امنیتی شده و منجر به نفوذ میشود بنابر این برنامه نویسان باید باگ ها را شناخته و راه حل آن را اجرا نمایند.
باگ xss
باگ XSS مخفف عبارت Cross site Scripting است و برای تناقض نداشتن با Css، به آن XSS میگویند. در این مشکل، حمله ای که هکر برنامه ریزی کرده با استفاده از کد مخربی است که دربردارنده کدهای جاوا اسکریپت بوده و با تزریق آن به سایت و باز کردن آن توسط کاربر، هکر به چیزی که میخواهد میرسد و دلیل آن فیلتر نشدن برخی ورودی هاست. به طور مثال سایت های بسیاری وجود دارد که در آن کاربران نظرات خود را به ثبت میرسانند؛ حال اگر کاربری در قسمت نظرات، نظری را وارد کند که شامل کد جاوا اسکریپت است و یا اینکه هکر با استفاده از ترفندی، نظر کاربر را جلب کند و صفحه را باز کند که در این صورت، هکر با استفاده از دستور get، دستور مورد نظر را اجرا میکند.
نمونه کدی که از باگ xss آسیب پذیر است:
echo $_GET["user"] ;
با وارد کردن هر عبارتی در در ایندکس یوزر متد گت در کد بالا، منجر به اجرا شدن باگ میشود.
راه حل:
ورودی ها را باید از خطرات پاکسازی کرد که در این صورت تز تابع htmlspecialchars استفاده میشود که به شکل زیر است:
echo htmlspecicalchars($_GET['user']);