PDA

View Full Version : ایجاد ارتباط امن بین برنامه و سرور



mahmood.m
سه شنبه 30 آبان 1396, 00:57 صبح
با سلام و خسته نباشید خدمت دوستان عزیز و محترم

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

ممنون میشم دوستان عزیز راهنمایی کنید برنامه ای که در حال ساختش هستم از هر نظر خیلی برام مهمه و این بحث امنیت برای هر برنامه ای بزرگ و مهم خیلی خیلی ضروریه
پیشاپیش ممنون
شبتون بخیر

mz6488
سه شنبه 30 آبان 1396, 12:08 عصر
سلام.واس نمایش اطلاعات محرمانه بهتره که علاوه بر نام کاربری،باید رمز عبور رو هم بفرستید تا سمت سرور اول نام کاربری و رمز عبور بررسی شه و در صورت مطابقت داشتن عملیات رو انجام بده
راه های امن سازی سرور هم هرچند ممکن باز شکسته بشه ولی انجامش کاملا ضروریه:
1-نصب ssl روی سرور و استفاده از https به جای http
2-مبهم سازی آدرس های وب سرویس
3-رمزنگاری اطلاعات سمت سرور(عملیات رمز نگاری و رمزگشایی کاملا تو سرور انجام میشه.با خود mysql خیلی راحت این کار انجام میشه)

sara_aryanfar
سه شنبه 30 آبان 1396, 13:51 عصر
با سلام و خسته نباشید خدمت دوستان عزیز و محترم

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

ممنون میشم دوستان عزیز راهنمایی کنید برنامه ای که در حال ساختش هستم از هر نظر خیلی برام مهمه و این بحث امنیت برای هر برنامه ای بزرگ و مهم خیلی خیلی ضروریه
پیشاپیش ممنون
شبتون بخیر
خب نکته اول این مشکل برنامه نویسی شما هست که به این روش عمل کردید که کاملا اشتباه هست حالا تصور شما اینه که طرف فقط با نام کاربری می تونه اطلاعات اون کاربرو بگیره در حالی که احتمالا می تونه کل دیتابیس رو بزنه
در حالت کلی ما امنیت 100 درصد نداریم و هیچ کس هم نمی تونه چنین ادعایی داشته باشه اما خب فرق هست بین اینکه سایت رو یه هکر کار کشته بزنه با اینکه یه تازه کار بیاد برا تمرین سایت شما رو بزنه مورد دوم واقعا نشانگر مشکل برنامه نویس هست چون با برخی کارهای اولیه این دسته از هکر ها از رده خارج میشن و اون گردن کلفتا هم خیلی خیلی کم پیش میاد بیان سراغ سایت ایرانی و از این کارا بکنن
بهترین راهکار ارتباط با استفاده از وب سرویس هست یعنی شما دخواست خودتون رو همراه با نام کاربری و پسورد به وبسرویس ارسال کنید و اونجا پس از اعتبار سنجی لازم برای نام کاربری و پسورد اطلاعات کاربر رو براش ارسال کنید این از مسیر امن حالا طراحی مناسب و هاست مناسب هم برخی دیگر از موارد رعایت امنیت هستند که باید رعایت کنید با چنین اقداماتی دیگه سرویس شما حد اقل توسط تازه کارها زده نمیشه

sara_aryanfar
سه شنبه 30 آبان 1396, 13:55 عصر
سلام.واس نمایش اطلاعات محرمانه بهتره که علاوه بر نام کاربری،باید رمز عبور رو هم بفرستید تا سمت سرور اول نام کاربری و رمز عبور بررسی شه و در صورت مطابقت داشتن عملیات رو انجام بده
راه های امن سازی سرور هم هرچند ممکن باز شکسته بشه ولی انجامش کاملا ضروریه:
1-نصب ssl روی سرور و استفاده از https به جای http
2-مبهم سازی آدرس های وب سرویس
3-رمزنگاری اطلاعات سمت سرور(عملیات رمز نگاری و رمزگشایی کاملا تو سرور انجام میشه.با خود mysql خیلی راحت این کار انجام میشه)

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

mz6488
سه شنبه 30 آبان 1396, 15:06 عصر
با بقیه حرفاتون که بیشتر برای امنیت سرور هست موافقم اما این آخری رو متوجه نشدم چرا باید هم رمزنگاری و هم رمزگشایی داخل سرور باشه ؟ اصلا چه ارزشی داره اونوقت وقتی داخل سرور یک عملیات هست یعنی مراحل اهراز هویت رد شده و تنها گزینه عاقلانه رمزگشایی داده ای هست که در سمت کاربر رمزنگاری شده یعنی اصول کار فکر کنم همینه در سمت کاربر ما چیزی رو رمز می کنیم تا در حین ارتباط اگر این داده لو رفت کاربرد نداشته باشه و در سمت سرور هم رمزگشایی میشه
اینکه عملیات رمزنگاری و رمزگشایی سمت سرور باشه منظورم تو قسمت ذخیره داده هاس که مثلا رمز عبور به صورت شفاف داخل دیتابیس ذخیره نشه چون ممکن به روش های مختلفی داده ها لو بره.حالا اگه یک قسمت از عملیات رمزنگاری و رمزگشایی سمت کاربر صورت بگیره ممکن از طریق مهندسی معکوس خیلی راحت رشته انکد شده رو دیکد کنه چون سورس اپ در نهایت باز میشه

mahmood.m
سه شنبه 30 آبان 1396, 17:23 عصر
خب نکته اول این مشکل برنامه نویسی شما هست که به این روش عمل کردید که کاملا اشتباه هست حالا تصور شما اینه که طرف فقط با نام کاربری می تونه اطلاعات اون کاربرو بگیره در حالی که احتمالا می تونه کل دیتابیس رو بزنه
در حالت کلی ما امنیت 100 درصد نداریم و هیچ کس هم نمی تونه چنین ادعایی داشته باشه اما خب فرق هست بین اینکه سایت رو یه هکر کار کشته بزنه با اینکه یه تازه کار بیاد برا تمرین سایت شما رو بزنه مورد دوم واقعا نشانگر مشکل برنامه نویس هست چون با برخی کارهای اولیه این دسته از هکر ها از رده خارج میشن و اون گردن کلفتا هم خیلی خیلی کم پیش میاد بیان سراغ سایت ایرانی و از این کارا بکنن
بهترین راهکار ارتباط با استفاده از وب سرویس هست یعنی شما دخواست خودتون رو همراه با نام کاربری و پسورد به وبسرویس ارسال کنید و اونجا پس از اعتبار سنجی لازم برای نام کاربری و پسورد اطلاعات کاربر رو براش ارسال کنید این از مسیر امن حالا طراحی مناسب و هاست مناسب هم برخی دیگر از موارد رعایت امنیت هستند که باید رعایت کنید با چنین اقداماتی دیگه سرویس شما حد اقل توسط تازه کارها زده نمیشه

با سلام

واقعا حق با شماست.
نتیجه ای که از توضیحات شما دوستان گرفتم:
باید نام کاربری رو همراه با پسورد به سرور ارسال کنم و اعتبار سنجی بشه و اگه مطابقت داشت اطلاعات کاربر رو به سمت برنامه ارسال کنه.
کاربر mz6488 (http://barnamenevis.org/member.php?261140-mz6488) به نکته ی دیگه ای هم اشاره کردن که اطلاعات کاربر رو رمزنگاری و رمزگشایی کنیم آیا با استفاده از روش اول که اعتبار سنجی باشه بازهم لازمه که این نکته رو هم رعایت کنیم و اگه جواب مثبته میشه خواهش کنم در این مورد توضیحات بیشتری و نمونه کد ارائه کنید خیلی ممنون میشم.

mz6488
سه شنبه 30 آبان 1396, 17:42 عصر
با سلام

واقعا حق با شماست.
نتیجه ای که از توضیحات شما دوستان گرفتم:
باید نام کاربری رو همراه با پسورد به سرور ارسال کنم و اعتبار سنجی بشه و اگه مطابقت داشت اطلاعات کاربر رو به سمت برنامه ارسال کنه.
کاربر mz6488 (http://barnamenevis.org/member.php?261140-mz6488) به نکته ی دیگه ای هم اشاره کردن که اطلاعات کاربر رو رمزنگاری و رمزگشایی کنیم آیا با استفاده از روش اول که اعتبار سنجی باشه بازهم لازمه که این نکته رو هم رعایت کنیم و اگه جواب مثبته میشه خواهش کنم در این مورد توضیحات بیشتری و نمونه کد ارائه کنید خیلی ممنون میشم.
به هر حال احتیاط شرط عقله و بهتره رمزنگاری رو انچام بدید.روشی که من استفاده میکنم از طریق کد sql
دستور رمز نگاری

insert into users (pass) values(aes_encrypt('your_pass','your_key'))

دستور رمزگشایی

select cast(AES_DECRYPT(pass,'your_key') as char) from users

Nevercom
سه شنبه 30 آبان 1396, 18:07 عصر
الگوی مناسبتر، استفاده از توکن هست.

در حالت معمول، کاربر یکبار لاگین می‌کنه و پس از اون درخواست هایی رو به سمت سرور ارسال می کنه، اگر برای احراز هویت در همه‌ی درخواست ها یوزرنیم و پسورد رو ارسال کنید، معنیش این هست که این اطلاعات کاربر رو باید جایی ذخیره کنید (تا مجبور نباشه هربار پسوردش رو وارد کنه، مثلاً پس از لاگین برای ثبت نظر هم پسوردش رو وارد کنه)

در عوض هنگام لاگین یک توکن براش تولید می کنید و اون توکن رو در پاسخ ارسال می کنید، این توکن یک رشته‌ی یکتاست که به اون یوزر اختصاص داده شده (تا زمانی که اعتبارش از بین بره)، و یوزر پس از لاگین همراه همه‌ی درخواست ها باید این توکن رو ارسال کنه.

وقتی هم قراره عملیاتی انجام بشه، اطلاعات کاربر از توکن استخراج میشه و عملیات برای اون یوزر خاص صورت می گیره. یعنی اگر فرض کنیم یوزر بخواد اطلاعاتی رو حذف کنه، تنها باید بتونه اطلاعاتی که مربوط به خودش هست رو حذف کنه. پس سمت سرور درخواست رو که دریافت کردید، اول چک می کنید که توکن موجود باشه و معتبر هم باشه. بعد از توکن User ID رو استخراج می کنید و پس از اون چک می کنید که اطلاعات مورد درخواست برای حذف شدن، آیا مال خود اون یوزر هست یا خیر (تا جلوی این رو بگیرید که یک کاربر با داشتن توکن معتبر، بتونه اطلاعات دیگران رو تغییر بده).

استفاده از SSL خیلی مهم هست، بخصوص که با وجود سرویس هایی مثل Let's Encrypt، می تونید به رایگان گواهینامه SSL دریافت کنید و هیچ هزینه ای براتون نداره.

با پنهان سازی یا مبهم سازی آدرس های وب سرویس مخالفم، چون فقط دارید صورت مسئله رو پاک می کنید. یک Public API باید خودش امن باشه، و با مخفی کردن این آدرس ها در کلاینت، یک توهمی از امنیت براتون ایجاد میشه که شاید باعث بشه در دیگر بخش ها کم‌کاری بشه.

موارد دیگری هم هستن که برای اینکه اطلاعاتتون تخلیه نشه، لازم هستن. مثلن فرض کنیم در برنامه قرار باشه اطلاعات یک محصول خاص نمایش داده بشه، در این حالت احتمالن ID محصول ارسال میشه تا اطلاعات اون محصول رو دریافت کنید، اگر این ID یک شناسه عددی باشه، یه نفر می تونه با توکن معتبر، یک اسکریپت بنویسه که اعداد متفاوت رو به ترتیب ارسال کنه و دیتابیس شما رو تخلیه کنه. برای جلوگیری از این مشکل، ID ها باید از جنس دیگری باشن، مثلن UUID یا حتی یک String.

اینها موارد ابتدایی هستن و بقیه‌ی موارد بستگی به ساختار پروژه و نیازمندی های اون داره.

mahmood.m
سه شنبه 30 آبان 1396, 21:22 عصر
به هر حال احتیاط شرط عقله و بهتره رمزنگاری رو انچام بدید.روشی که من استفاده میکنم از طریق کد sql
دستور رمز نگاری

insert into users (pass) values(aes_encrypt('your_pass','your_key'))

دستور رمزگشایی

select cast(AES_DECRYPT(pass,'your_key') as char) from users


با سلام

خیلی ممنون
از همه تون ممنونم دوستان واقعا که کم نذاشتید و توضیحات لازم رو دادید براتون آرزوی موفقیت دارم.

mahmood.m
چهارشنبه 01 آذر 1396, 20:45 عصر
الگوی مناسبتر، استفاده از توکن هست.

در حالت معمول، کاربر یکبار لاگین می‌کنه و پس از اون درخواست هایی رو به سمت سرور ارسال می کنه، اگر برای احراز هویت در همه‌ی درخواست ها یوزرنیم و پسورد رو ارسال کنید، معنیش این هست که این اطلاعات کاربر رو باید جایی ذخیره کنید (تا مجبور نباشه هربار پسوردش رو وارد کنه، مثلاً پس از لاگین برای ثبت نظر هم پسوردش رو وارد کنه)

در عوض هنگام لاگین یک توکن براش تولید می کنید و اون توکن رو در پاسخ ارسال می کنید، این توکن یک رشته‌ی یکتاست که به اون یوزر اختصاص داده شده (تا زمانی که اعتبارش از بین بره)، و یوزر پس از لاگین همراه همه‌ی درخواست ها باید این توکن رو ارسال کنه.

وقتی هم قراره عملیاتی انجام بشه، اطلاعات کاربر از توکن استخراج میشه و عملیات برای اون یوزر خاص صورت می گیره. یعنی اگر فرض کنیم یوزر بخواد اطلاعاتی رو حذف کنه، تنها باید بتونه اطلاعاتی که مربوط به خودش هست رو حذف کنه. پس سمت سرور درخواست رو که دریافت کردید، اول چک می کنید که توکن موجود باشه و معتبر هم باشه. بعد از توکن User ID رو استخراج می کنید و پس از اون چک می کنید که اطلاعات مورد درخواست برای حذف شدن، آیا مال خود اون یوزر هست یا خیر (تا جلوی این رو بگیرید که یک کاربر با داشتن توکن معتبر، بتونه اطلاعات دیگران رو تغییر بده).

استفاده از SSL خیلی مهم هست، بخصوص که با وجود سرویس هایی مثل Let's Encrypt، می تونید به رایگان گواهینامه SSL دریافت کنید و هیچ هزینه ای براتون نداره.

با پنهان سازی یا مبهم سازی آدرس های وب سرویس مخالفم، چون فقط دارید صورت مسئله رو پاک می کنید. یک Public API باید خودش امن باشه، و با مخفی کردن این آدرس ها در کلاینت، یک توهمی از امنیت براتون ایجاد میشه که شاید باعث بشه در دیگر بخش ها کم‌کاری بشه.

موارد دیگری هم هستن که برای اینکه اطلاعاتتون تخلیه نشه، لازم هستن. مثلن فرض کنیم در برنامه قرار باشه اطلاعات یک محصول خاص نمایش داده بشه، در این حالت احتمالن ID محصول ارسال میشه تا اطلاعات اون محصول رو دریافت کنید، اگر این ID یک شناسه عددی باشه، یه نفر می تونه با توکن معتبر، یک اسکریپت بنویسه که اعداد متفاوت رو به ترتیب ارسال کنه و دیتابیس شما رو تخلیه کنه. برای جلوگیری از این مشکل، ID ها باید از جنس دیگری باشن، مثلن UUID یا حتی یک String.

اینها موارد ابتدایی هستن و بقیه‌ی موارد بستگی به ساختار پروژه و نیازمندی های اون داره.

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

Nevercom
جمعه 03 آذر 1396, 19:29 عصر
خود توکن چیز عجیب و پیچیده ای نیست.

ایده این هست که کاربر برای انچام برخی کارها قبلش باید لاگین کرده باشه، و پس از لاگین و در درخواست های بعدی تشحیص بدیم که این همون یوزر هست که لاگین کرده.
در این حالت پس از لاگین یک رشته‌ی طولانی و غیرقابل حدس زدن تولید می کنیم و اون رو جایی (مثلاً در دیتابیس) ذخیره می کنیم، همچنین در هنگام ذخیره سایر اطلاعات موردنیاز رو هم ذخیره می کنیم که در حداقل اون کد کاربری هست، یعنی در هر رکورد حداقل یک توکن و یک کد کاربری داریم. در این حالت با دریافت توکن می تونیم کد کاربر صاحب توکن رو پیدا کنیم. اطلاعات بیشتر مثلاً می تونه تاریخ اعتبار باشه، که کنترل کنیم هر توکن مثلاً ۲ روز اعتبار داشته باشه.

حالا هروقت درخواستی دریافت کنیم که نیاز به احراز هویت داشته باشه، توقع داریم که همراه درخواست توکن هم ارسال بشه، بعد از اون باید چک کنیم که اون توکن واقعاً در سیستم ما وجود داره و مثلاً تاریخ انقضاش هم هنوز نرسیده.

با این کار ما یک شناسه داریم که فقط برای ما معنا داره و با استفاده از اون نمیشه به کد کاربری و رمز عبور پی برد، و همون کارکرد یک سیستم احراز هویت رو داره.

در مورد توکن در این تاپیک بیشتر توضیح دادم: ذخیره حالت لاگین در سرور - ضروری (http://barnamenevis.org/showthread.php?513674-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%AD%D8%A7%D9%84%D8%AA-%D9%84%D8%A7%DA%AF%DB%8C%D9%86-%D8%AF%D8%B1-%D8%B3%D8%B1%D9%88%D8%B1-%D8%B6%D8%B1%D9%88%D8%B1%DB%8C)

kamal70
جمعه 03 آذر 1396, 23:55 عصر
به نظر من برای افزایش امنیت پروژه هاتون از فریم ورک ها استفاده کنید هم راحت تره هم سریع تر هم امن تر

mahmood.m
شنبه 04 آذر 1396, 09:55 صبح
خود توکن چیز عجیب و پیچیده ای نیست.

ایده این هست که کاربر برای انچام برخی کارها قبلش باید لاگین کرده باشه، و پس از لاگین و در درخواست های بعدی تشحیص بدیم که این همون یوزر هست که لاگین کرده.
در این حالت پس از لاگین یک رشته‌ی طولانی و غیرقابل حدس زدن تولید می کنیم و اون رو جایی (مثلاً در دیتابیس) ذخیره می کنیم، همچنین در هنگام ذخیره سایر اطلاعات موردنیاز رو هم ذخیره می کنیم که در حداقل اون کد کاربری هست، یعنی در هر رکورد حداقل یک توکن و یک کد کاربری داریم. در این حالت با دریافت توکن می تونیم کد کاربر صاحب توکن رو پیدا کنیم. اطلاعات بیشتر مثلاً می تونه تاریخ اعتبار باشه، که کنترل کنیم هر توکن مثلاً ۲ روز اعتبار داشته باشه.

حالا هروقت درخواستی دریافت کنیم که نیاز به احراز هویت داشته باشه، توقع داریم که همراه درخواست توکن هم ارسال بشه، بعد از اون باید چک کنیم که اون توکن واقعاً در سیستم ما وجود داره و مثلاً تاریخ انقضاش هم هنوز نرسیده.

با این کار ما یک شناسه داریم که فقط برای ما معنا داره و با استفاده از اون نمیشه به کد کاربری و رمز عبور پی برد، و همون کارکرد یک سیستم احراز هویت رو داره.

در مورد توکن در این تاپیک بیشتر توضیح دادم: ذخیره حالت لاگین در سرور - ضروری (http://barnamenevis.org/showthread.php?513674-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%AD%D8%A7%D9%84%D8%AA-%D9%84%D8%A7%DA%AF%DB%8C%D9%86-%D8%AF%D8%B1-%D8%B3%D8%B1%D9%88%D8%B1-%D8%B6%D8%B1%D9%88%D8%B1%DB%8C)

با سلام

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

در این مورد چه نظری دارید؟
پیشاپیش ممنون

Nevercom
شنبه 04 آذر 1396, 13:14 عصر
خب احراز هویت فقط تا این حد بهتون کمک می کنه که جلوی دسترسی غیرمجاز رو بگیرید و فعالیت هر کاربر رو محدود به اطلاعات خودش بکنید (درصورت نیاز). هرچیزی فراتر از این رو باید بنا به نیاز پروژه ایجاد کنید

مثلاً سیستم Permission به شما کمک می کنه که دسترسی کاربرها رو با دقت بیشتری کنترل کنید، مثلاً به یک یوزر خاص اجازه بدید که کامنت ها رو حذف کنه، اما دسترسی مدیریتی بیشتری نداشته باشه.

بعد از اون مثلاً در مثالی که زدید، می تونید محدودیت در تعداد درخواست ها در دقیقه بزارید، مثلاً منطقی نیست که هر کاربر در هر ۳ تانیه بیشتر از یک لایک رو انجام بده، پس در دقیقه ۲۰ تا لایک رو بهش مجوز می‌دید. حتی می تونید محدودیت رو در تعداد درخواست ها، در سطح وب سرویس قرار بدید، مثلاً بگیر هر IP مجاز به ارسال ۶۰ درخواست در دقیقه هست و نه بیشتر.

یا بعنوان یک لایه امنیتی دیگه من از Fail2Ban در سرور استفاده می کنیم و به شکلی کانفیگ کردم که اگر در ۱۰ دقیقه، بیشتر از ۳ بار پسورد اشتباه بزنه، تا ۱۰ دقیقه بعدش اون IP رو Ban کنه.

همونطور که گفتم، هیچ قانونی وجود نداره که برای همه ی شرایط جواب بده، باید برای هر پروژه جداگانه تصمیم گیری کنید. اینهایی که قبلتر توضیح دادم پایه های سیستم امنیتی محسوب میشه و به خودی خود امنیت چندانی فراهم نمی کنه

mahmood.m
شنبه 04 آذر 1396, 13:37 عصر
خب احراز هویت فقط تا این حد بهتون کمک می کنه که جلوی دسترسی غیرمجاز رو بگیرید و فعالیت هر کاربر رو محدود به اطلاعات خودش بکنید (درصورت نیاز). هرچیزی فراتر از این رو باید بنا به نیاز پروژه ایجاد کنید

مثلاً سیستم Permission به شما کمک می کنه که دسترسی کاربرها رو با دقت بیشتری کنترل کنید، مثلاً به یک یوزر خاص اجازه بدید که کامنت ها رو حذف کنه، اما دسترسی مدیریتی بیشتری نداشته باشه.

بعد از اون مثلاً در مثالی که زدید، می تونید محدودیت در تعداد درخواست ها در دقیقه بزارید، مثلاً منطقی نیست که هر کاربر در هر ۳ تانیه بیشتر از یک لایک رو انجام بده، پس در دقیقه ۲۰ تا لایک رو بهش مجوز می‌دید. حتی می تونید محدودیت رو در تعداد درخواست ها، در سطح وب سرویس قرار بدید، مثلاً بگیر هر IP مجاز به ارسال ۶۰ درخواست در دقیقه هست و نه بیشتر.

یا بعنوان یک لایه امنیتی دیگه من از Fail2Ban در سرور استفاده می کنیم و به شکلی کانفیگ کردم که اگر در ۱۰ دقیقه، بیشتر از ۳ بار پسورد اشتباه بزنه، تا ۱۰ دقیقه بعدش اون IP رو Ban کنه.

همونطور که گفتم، هیچ قانونی وجود نداره که برای همه ی شرایط جواب بده، باید برای هر پروژه جداگانه تصمیم گیری کنید. اینهایی که قبلتر توضیح دادم پایه های سیستم امنیتی محسوب میشه و به خودی خود امنیت چندانی فراهم نمی کنه

با سلام

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

Nevercom
شنبه 04 آذر 1396, 16:13 عصر
Fail2Ban ابزاری هست که روی سرور نصب میشه (نمی دونم نسخه ویندوز هم داره یا نه) و کارکردش به این شکل هست که تمامی لاگ های سرور رو می‌خونه و در بین اونها دنبال الگوی خاصی می گرده، اگر پیداشون کرد با قواعدی که مشخص کردیم بررسیشون می کنه و مثلن اگر تعیین کردیم در ۱۰ دقیقه باید بیشتر از ۳ تا ازشون پیدا نکنه، اگر بیشتر از اون تعداد شد، به مدتی که تعیین کردیم اون IP رو به قایروال معرفی می کنه و اون IP بن (Ban) میشه و درخواستش به وب سرور نمیرسه. بعد از زمان مشخص اون IP رو از بلک لیست خارح می کنه.

بصورت پیشفرض تمام لاگ های موجود در دایرکتوری /var/log/ رو بررسی می کنه، می تونید لاگ های خاصی رو بهش اضافه کنید یا اینکه بگید بررسیشون نکنه. در حالت پیشفرض لاگ های مربوط به SSH رو بررسی می کنه و اگر چندبار تلاش ناموفق از یک IP برای ورود از طریق SSH صورت بگیره، اون رو بلاک می کنه.

حالا شما می تونید پس از ورود ناموفق در وب اپلیکیشن، یک عبارت خاص رو لاگ کنید و الگویی به Fail2Ban معرفی کنید که بتونه اون عبارت رو شناسایی کنه و IP ازش استخراج کنه و بنش کنه. درحالت ساده با لاگ کردن یه عبارت توسط دستور error_log در PHP و دستورهای مشابه در سایر زبان ها، عبارتی رو در فایل لاگ وب سرور لاگ کنید که با اینکار IP هم در اون لاگ ذخیره میشه.

این مقاله خوبی در این زمینه هست: https://www.digitalocean.com/community/tutorials/how-to-protect-an-nginx-server-with-fail2ban-on-ubuntu-14-04

mahmood.m
شنبه 04 آذر 1396, 16:36 عصر
Fail2Ban ابزاری هست که روی سرور نصب میشه (نمی دونم نسخه ویندوز هم داره یا نه) و کارکردش به این شکل هست که تمامی لاگ های سرور رو می‌خونه و در بین اونها دنبال الگوی خاصی می گرده، اگر پیداشون کرد با قواعدی که مشخص کردیم بررسیشون می کنه و مثلن اگر تعیین کردیم در ۱۰ دقیقه باید بیشتر از ۳ تا ازشون پیدا نکنه، اگر بیشتر از اون تعداد شد، به مدتی که تعیین کردیم اون IP رو به قایروال معرفی می کنه و اون IP بن (Ban) میشه و درخواستش به وب سرور نمیرسه. بعد از زمان مشخص اون IP رو از بلک لیست خارح می کنه.

بصورت پیشفرض تمام لاگ های موجود در دایرکتوری /var/log/ رو بررسی می کنه، می تونید لاگ های خاصی رو بهش اضافه کنید یا اینکه بگید بررسیشون نکنه. در حالت پیشفرض لاگ های مربوط به SSH رو بررسی می کنه و اگر چندبار تلاش ناموفق از یک IP برای ورود از طریق SSH صورت بگیره، اون رو بلاک می کنه.

حالا شما می تونید پس از ورود ناموفق در وب اپلیکیشن، یک عبارت خاص رو لاگ کنید و الگویی به Fail2Ban معرفی کنید که بتونه اون عبارت رو شناسایی کنه و IP ازش استخراج کنه و بنش کنه. درحالت ساده با لاگ کردن یه عبارت توسط دستور error_log در PHP و دستورهای مشابه در سایر زبان ها، عبارتی رو در فایل لاگ وب سرور لاگ کنید که با اینکار IP هم در اون لاگ ذخیره میشه.

این مقاله خوبی در این زمینه هست: https://www.digitalocean.com/community/tutorials/how-to-protect-an-nginx-server-with-fail2ban-on-ubuntu-14-04

با سلام

مفید بود خیلی چیزا یاد گرفتم.
ممنون از شما