campaign-Ghorban-to-Ghadir

امنیت در برنامه نویسی PHP و شناسایی خطرات امنیتی



visibility  
mode_comment   ۳۸

در جلسه ی امروز در مورد بحث بسیار مهم امنیت در زبان PHP صحبت می کنیم و بیش از 20 نکته ی مهم رو برای رعایت موارد امنیتی و کدنویسی امن به شما توضیح می دیم .

 

موارد مطرح شده در این جلسه عبارتند از :

فصل 16 : امنيت در PHP : شناسايي باگ هاي امنيتي و رفع آن ها

  • چرا و چگونه برنامه هايي ايمن بنويسيم ؟
  • شناخت انواع حملات و مشکلات امنيتي، پيشنيازي براي نوشتن برنامه هاي امن
  • دلايل ايجاد ناامني در برنامه هاي PHP و راه حل رفع انها
  • قانون اول ! عدم اعتماد به داده ها کاربران
  • مشکلات در پيکربندي وب سرور
  • مشکلات ناشی از فعال بودن register_globals و نحوه ی غیر فعال سازی آن
  • عدم تنظيم صحيح نحوه ي گزارش خطاها
  • مشکلات موجود به دلیل عدم انتخاب انکودینگ استاندارد
  • ساختار نامناسب برنامه برای لود کردن فایلها
  • عدم استفاده از نام ها و مقادیر پیش فرض
  • حذف فایل های نصب اسکریپت ها پس از اتمام مراحل نصب
  • قابل پیشبینی بودن رفتار ، ساختار و کدهای شما و مشکلات آن
  • غیرفعال سازی و یا استفاده ی صحیح از Powerful Commands ها در php
  • انتخاب نوع و سایز مناسب برای ستون های جداول پایگاه داده
  • پسوردهای ضعیف و مشکلات ناشی از آن
  • خصوصیت های یک  پسورد مطمئن و قوی
  • مشکلات امنيتي مربوط به ديتابيس و تزريق SQL یا SQL Injection
  • مشکلات ناشي از تزريق کد و داده هاي خطرناک (Cross-Site Scripting - XSS)
  • مشکلات ناشي از دزيده شدن Session ها و Cookie ها
  • حملات CSRF و راهکارهاي مقابله با آن
  • کهنه بودن ورژن نرم افزارها و اسکريپت ها
  • استفاده از فریم ورک های معروف برای رفع بسیاری از نگرانی های امنیتی
  • مشکلات موجود در هاست های اشتراکی، تهیه ی هاست از شرکت های معتبر و متخصص
  • آماده ی حمله ی هکرها باشید ! چه مسائلی را باید همیشه رعایت کنم و به یاد داشته باشم ؟
  • آشنايي بيشتر با الگوريتم هاي کدگذاري و Hash کردن
info توجه

این مطلب یک جلسه از آموزش برنامه نویسی PHP می باشد و برای مشاهده آن باید در دوره ثبت نام کنید.

ثبت نام در آموزش برنامه نویسی PHP

comment دیدگاه کاربران
آرمین replyپاسخ

سلام آقای آوند شما تابع prepare رو در pdo توضیح دادید ولی میشه بگید در mysqli به چه شکله ؟ والا هرچی سرچ کردم یه توضیح مناسب براش پیدا نکردم . 🙁

لقمان آوند

در اینجور موارد به صفحه تابع در وبسایت رسمی php مراجعه کنید که حاوی توضیحات و مثال های خوبی هست .

Farshad replyپاسخ

با سلام
برای مشکل CSRF از http_referer استفاده کردم ولی برای iframe درست کار نمی کنه راه حلی هست؟

لقمان آوند

:: روش های مقابله با csrf عبارتند از :
– انجام عملیات و تراکنشها به صورت چند مرحله ای . (یه صفحه وبسایت شما همه کار رو مستقیما انجام نده)
– استفاده از http_referer
– کمک گیری از کدهای captcha برای انجام نهایی تراکنش و پردازش ها
از دو روش دیگه کمک بگیرید …

Farshad

یه مورد دیگه :
یه جایی خوندم که مثلا اگه پاک شدن پست ها به این صورت باشه : delete /1/
مهاجم می تونه یه سری تگ img که src اونا به صورت بالا باشه در قالب ایمیل برای هدف ارسال کنه .این جا راه حل ؟؟
از طرفی معمولا برای پاک کردن پست ها captcha نمی زارن
اگه بخوایم این جا چند مرحله ای بشه چی کار باید کرد؟؟
در ضمن http_referer با iframe هیچ راهی نداره؟

لقمان آوند

نه، referer تنها، راه حل کاملی نیست …
یه پیام تائیدیه برای حذف شدن بزار. مثلا یه confirm جاوااسکریپت ….

Farshad replyپاسخ

نفهمیدم الان راه حل مشکل بالا چیه؟

نمی دونم درست می گم یا نه : confirm جاوااسکریپت فقط یه پیام هست و کار خاصی انجام نمیده…فقط این که اگه کاربر حواسش نبود روی delete کلیک کرد پاک نشه…

لقمان آوند

خوب تو کانفیرم پیام رو می نویسی دیگه . که ایا مطمئنید که می خواید حذف بشه ؟ دیگه احتمال خطای کاربر طبیعی هست دیگه …
مشکلت با آیفریم رو هم دقیق تر توضیح بده که چیه …؟

Farshad

نمی دونم درست می گم یا نه:
مثلا یه صفحه ای داریم مثل :test/admin که ادمین می تونه تو این جا پست ها رو پاک کنه ، confirm جاوااسکریپت تو لینک delete پست ها قرار می دیم که از admin سوال بشه،.
حالا اگه Admin لینک delete یک پست را (که این هست test/admin/delete/1 )در tab جدید باز کنه دیگه اون پیام نمیاد ! پس اگه مهاجم تو اون ایمیل عکس ها رو به اون صورت که توضیح دادم قرار بده دیگه پیامی واسه admin نمیاد که ایا مطمئنید که می خواید حذف بشه ؟ ….

لقمان آوند

حرف شما کاملا درسته. من توجیه نبودم و پیشنهادم اشتباه بود .
از کلاس های کمکی مثل noCsrf کمک بگیر که راه حل قویتری ارئه میدن …

Farshad replyپاسخ

با سلام
صفحه از بانک ملی رو به صورت iframe در صفحه ای قرار دادم .اصلا iframe کار نکرد.یعنی نه چیزی نشون میده نه سورسی برای iframe وجود داره.
برای انجام این کار ، این منطق درسته؟ : اگر url مرورگر با http_refere (که هر دوبا js دزیافت شده)یکی بود پس صفحه ما به صورت iframe مورد استفاده قرار گرفته؟
سوال دیگه این که آیا راهی برای رمزگزاری کد js وجود داره طوری که سورس کد ها قابل فهم نباشه؟

لقمان آوند

خوب بعضی وبسایت ها با کمک جاوااسکریپت اجازه نمی دن صفحه وب توی iframe باز بشه .
کد جاوااسکریپت تشخیص اینکه صفحه تو iframe باز شده به شکل زیر هست :

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

Farshad

با سلام
یه راهنمایی در مورد انکود کد ها می کنید-
چند تا چیز مثل JXP پیدا کردم ولی ..؟!
*******
بابت پاسخ دهی به سوالات ، خیلی ممنون

لقمان آوند

سوالتون چی هست ؟
می خواید کدها رو انکود کنید یا می خواید بدونید چطور اینکود می کنن ؟

Farshad replyپاسخ

با سلام
در مورد اینکه چطور اینکود می کنن ؟و طوری که قابل برگشت نباشه؟
کدهای JS سمت کاربر اجرا می شه پس واسه کد گزاری باید توابع عجیب و غریب بنویسیم که راه حل درستی نیست یا خود مرورگر ها سیستمی واسه کد گزاریشون داشته باشن …چه طور ممکنه انکود بشن؟! …

لقمان آوند

راه حل ها بیشتر حاوی کد کردن و ایجاد ابهام در کدها هست. و معمولا راه حلی که 100% غیربرگشت پذیر باشه وجود نداره ولی خوب ابزارهای خیلی معروفی مثل Zend Guard وجود داره که اینکارو خیلی خوب انجام میده .
شخصا تا حالا تست و بررسی نکردم. ولی می تونید با عبارت php source code protection سرچ کنید موارد خوبی رو خواهید یافت ..

بردیا راستین replyپاسخ

سلام استاد به هنگام استفاده از تابع
mysql real escape string
ارور میده و میگه این تابع از پی اچ پی 5.5 به بعد حذف شده اشکالی نداره ازش چشم پوشی کنیم ؟

لقمان آوند

سلام
اینو که تو دوره گفتیم. به جاش از mysqli real escape string استفاده کنید .

Massud Tarekhi replyپاسخ

با سلام
من قبلا یه استرینگ رو به صورت shuffle در اوردم و با md5 هش کردم سپس به وبسایت
http://www.onlinehashcrack.com/
رفتم و اونجا وارد کردم بعد از سه ماه یه ایمیل برام فرستاد که پسورد کرک شده ولی باید 4 دلار پرداخت کنی که پسورد رو بهت ایمیل کنه

لقمان آوند

هش md5 قابل کشف هست با وجود منابع پردازشی قوی
از الگوریتم های قویتر به همراه salt مثل sha256 و … استفاده کن. این مقاله رو هم بخون توضیحات خیلی خوبی داده .

Massud Tarekhi

این مقاله رو قبلا خونده بودم (جلسه کار با رشته ها) به همراه دو سه تا مقاله دیگه
هر چیزی که شما می گید میرم و سرچ می کنم تا چیز های زیادی یادبگیرم به همین دلیل اینجا زیاد سوال نمی پرسم

لقمان آوند

خیلی خوبه که اینکارو میکنه. بعدها نتیجش رو خواهی دید…
موفق باشی

Yazda replyپاسخ

سلام .. یه سوالی برام پیش اومده. اینکه آیا هش کردن یوزرنیم هم مثل پسورد باعث امنیت بیشتر میشه؟ یا نه تاثیری نداره؟ اصلا کار منطقی هست؟
ندیدم جایی یوزرنیم رو هش کنن. برا همین سوال شد برام.

لقمان آوند

سلام
بله طبیعتا امنیت اطلاعات رو بالا میبره. ولی دردسرش زیاد میشه و به همین کمتر جایی یوزرنیم رو هش می کنن. چون خیلی جاها تو برنامه ها لازم داریم یوزرنیم ها رو بگیریم و یا روشون کوئری بزنیم که اگر هش باشه اذیت میکنه !

sadaf replyپاسخ

سلام
شما گفتین فایل هارو از طریق url لود نکنیم.راستش من درست متوجه این حرفتون نشدم.
مثلا وقتی میخوایم صفحه user.php رو باز کنیم نیایم از طریق ادرس get اون صفحه رو بالا نشون بدیم
بیایم برای باز کردن فایل هامون از دستور header استفاده کنیم تا کسی متوجه نشه چه صفحه ای باز شده درسته این حرفم؟
میشه با یک مثال توضیح بدین.
و یک سوال دیگه اینکه میشه لطف کنید یه مکان خوب برای خرید هاست رو معرفی کنید.
تشکر

لقمان آوند

دقیقا متوجه سوالتون نشدم. در کدوم دقیقه از این جلسه در این باره صحبت کردم ؟ بگید که مجدد نگاه کنم و پاسخ بدم …

sadaf

جلسه 20 دقیقه 20
سوال من اینه استاد الان مثلا من روی دکمه تبلیغات از منو که زدم بوسیله تگ a میره به
همین صفحه و توی نوارادرس مرورگر مثلا مینویسه
locallhost:wamp/user/tablighat.php
من میخواستم بدونم این مدل ادرس دهی من که مستقیم اسم فایل رو اوردم اشتباهه؟
چکار کنم که یک آدرس به این صورت بسازه و اسم فایل اصلی نشون داده نشه
http://www.7learn.com/tutorials/php-class-part20-security/comment-page-1#comment-39307
الان اینجا فکر میکنم فقط اسم پوشه ها اومده
راستش استاد به طور دقیق این قسمت از درس رو متوجه نشدم

لقمان آوند

موردی که اونجا گفتیم ساده هست. گفتیم اسم و آدرس فایل ها رو به عنوان مقدار یه پارامتر get بعد از url سایت یا صفحه دریافت نکنید همون بخشی که بعد از علامت سوال در ویدیو گفتیم و توضیح دادیم. این ربطی به آدرس دهی در تگ a و … نداره.
اون نحوه ی تغیر url که گفتید مربوط به پوشه ها نیست. با استفاده از htacess میشه ساختار url ها رو تغیر داد که بحث این دوره نیست .

وحید آشوری replyپاسخ

سلام
من یک سایت وردپرس ، چند وقت پیش طراحی کرده بودم که متاسفانه اون سایت هک شد . منم برای بررسی علت هک قسمتی از متن هکر رو که در سایت قرار داده بود را در گوگل سرچ کردم . که با تعداد سایت های زیادی رو به رو شدم که توسط اون هکر هک شده بود. بعد از بررسی نتایج جست و جو صفحه ی اول گوگل متوجه شدم که تمامی سایت هایی که در صفحه اول گوگل قرار دارند و هک شده اند مثل من از هاست های ، تهران هاست استفاده می کردند. بنابر این نتیجه گیری که من کردم این بود که مشکل هک شدن از هاست می باشد. و این رو با پشتیبانی هاستینگ در میان گذاشتم که بعد از چند وقت علت هک رو SQL Injection بیان کردن. و خلاصه گفتن به خاطر هاست نیست.
عبارتی که من در گول سرچ کردم و اگر این عبارت سرچ کنید سایت های پیدا شده مشابه سایت هک شده من می باشند.
Mr_BL4cKH3T sheytan azzam
استاد ممنون میشم شما هم نظر تخصصی تون رو در این مورد بدین .

لقمان آوند

سلام
اگر همه هک شده ها از تهران هاست بودند طبیعتا احتمال نفوذ به هاست بیشتر هست. بعید می دونم در نسخه های اخیر وردپرس باگ امنیتی مربوط به sql injection وجود داشته باشه!

میثم جبارزاده replyپاسخ

با عرض سلام و خسته نباشید؛
می خواستم بدونم اگر از توابع هش سمت کاربر استفاده کردم و در جاوا اسکریپت هش انجام شد اگر کاربر به هر دلیل جاوا اسکریپت فعال نداشت چگونه برخورد کنیم؟ آیا هش سمت کلاینت درست نیست؟

لقمان آوند

بهتره اینکارو سمت سرور انجام بدید. اگه سمت کاربر انجام بدید هم امکان غیرفعال سازیش هست، هم امکان لو رفتن الگوریتم هشتون، هم امکان دستکاری توسط کاربر !

میثم جبارزاده replyپاسخ

به نظرم موارد گفته شده در خصوص امنیت برای یک سایت آنلاین واقعی کافی نیست.
استاد لطفا اگر امکان داره در خصوص امنیت بیشتر راهنمایی کنید من از قبل با php آشنا بودم و صرفا این بسته آموزشی رو جهت تامین امنیت بیشتر خریداری کردم اما واقعیتش اینه که احساس می کنم سایتی که قراره آنلاین بشه به امنیت خیلی خیلی بالاتری نیاز داشته باشه.
سایت خودتون واقعا به موارد امنیتی گفته شده اکتفا کرده؟؟
باز هم از استاد عزیزم تشکر میکنم امیدوارم بررسی گردد.

لقمان آوند

سلام
مهمترین نکات مورد نیاز امنیتی رو ما ذکر کردیم که اگر رعایت کنید قطعا از لحاظ امنیتی وبسایتتون تا حدود زیادی امن میشه …
البته خیلی مسائل هست که به کدنویسی ممکنه مربوط نشه و در مباحث امنیتی مهم باشه . مثل پیکربندی سرور، آپدیت و رفع باگ های نرم افزاری نصب شده رو سرور و …
کلا مقوله امنیت خیلی گسترده هست. مواردی که گفتیم تقریبا اکثر اون چیزی بود که شما در کدنویسی و استفاده از خود نرم افزار می تونید رعایت کنید.

میثم جبارزاده replyپاسخ

سلام و خسته نباشید
اگر قرار باشه پسورد بصورت plain text سمت سرور فرستاده بشه امکان شنودش وجود داره چون پروتکل http امن نیست!!!! پس احتمالا کنار هشینگ سمت سرور سمت کاربر هم لازم هست انجام بشه
استاد واقعیتش خیلی دوست داشتم دقیقا کدهای مربوط به امنیت یک سایت آنلاین رو ببینم.
فکر می کنم اون چیزی که تو واقعیت اتفاق می افته بسیار فراتر از اینهاست!!!!
استاد با مطالب گفته شده واقعا امنیت مطلوب رو تامین کردیم؟

لقمان آوند

اگر شنود ارتباط بین کلاینت و سرور هم مهمه براتون می تونید اینکار هم بکنید. ولی در کل هش سمت کلاینت نباید جایگزین سمت سرورش بشه! ولی خوب با هم استفاده کردنش هم می تونه مشکلی که گفتید رفع کنه تا حدودی …
کلا امنیت یه بحث نسبی هست و نمیشه ادعا کرد 100% امنیت وجود داره. ولی میشه به سمت 100% نزدیک و نزدیکتر شد. بله اگر مواردی که گفته شده رعایت کنید می تونید بابت خیلی از نگرانی های امنیتی خیالتون راحت باشه …

Behdad Khateri replyپاسخ

سلام خسته نباشید
گاهی در اخبار گفته میشه که یک فرد کم سن و سال سایتهای دولتی رو هک کرده!!! قطعا سایتهای دولتی امنیت کمی ندارند. آیا لزوما هکر دانش بالایی دارد؟ و استفاده از توابع برای جلوگیری از کد اینجکشن و… در اکثر سایتها رعایت میشون به نظر شما هکر ها معمولا از چه روشهایی استفاده میکنند؟

لقمان آوند

حالا کی گفته امنیت سایتای دولتی زیاده؟ وقتی سایتایی مثل فیسبوک، توییتر و لینکدین بعضا نقصای امنیتی توشون پیدا میشه اینا که سهله!
راه های نفوذ زیاده. کافیه یه نقص امنیتی مستعد حمله پیدا بشه برای هکر و این کافیه تا کارشو انجام بده .

ارسال نظرات

کاربر گرامی، امکان ارسال نظر و پشتیبانی برای دوره های مجازی فقط برای دانشجویان این دوره امکان پذیر می باشد.