Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Security
Code

بهترین کار در زمان کار با داده های حساس: امن سازی اپلیکیشن

by
Difficulty:BeginnerLength:MediumLanguages:

Persian (پارسی) translation by Alireza Farasat Memar (you can also view the original English article)

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

استفاده از دیتابیس

زمانی که با دیتابیس ارتباط برقرار می کنید، برای این که داده هایتان امن بمانند، نکات زیر را در ذهن داشته باشید:

همیشه پرس و جوها رو تمیز کنید

برای اینکه حمله کنندگان نتوانند از حملات تزریق SQL استفاده کنند، باید تمام ورودی های کاربر را تمیز کنید تا آنها نتوانند به اپلیکیشن شما کُد SQL تزریق کنند (مثل هنگام ورود کاربر). تقریبا در تمام درایورهای دیتابیس، برای تمام زبان ها، گزینه ای برای تمیز کردن ورودی های کابر وجود دارد. برای مثال در node-mysql برای Node.js، به جای انجام پرس و جویی شبیه زیر:

شما می توانید به صورت خورکار ورودی ها را توسط این خط کُد تمیز کنید:

متغییرهای داخل آرایه که به عنوان متغییر دوم تابع query فرستاده می شوند به جای علامت سوال های داخل رشته پرس و جو می نشینند و به صورت خوکار تمیز می شوند. عملی مشابه این را می توان در PHP به وسیله ی آماده ساز PDO انجام داد:

هیچ وقت به محتویات داخل دیتابیس اعتماد نکنید

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

امن نیست! اگر اشتباهی صورت بذیرد و id کاربر شامل کُد SQL باشد، آن وقت دچار مشکل خواهید شد. $row['id'] هم باید توسط تابع escape_string() کنترل و تمیز شود، مثل:

استفاده از نمک در زمان رمز کردن

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

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

نمکپاشی کلمه عبور در Node.js: node-mysql

در ابتدا شما باید نمک را ایجاد کنید. برای مثال می توانید از crypto.randomBytes():

این تابع بر اساس مستندات Node.js "در صورتی که آشفتگی کافی برای تولید رمزنویسی قوی داده" را نداشته باشد، خطا باز می گرداند. در چنین مواقعی یا شما باید دوباره تلاش کنید و یا از crypto.pseudoRandomBytes() استفاده کنید، که کارکترهای تصادفی بدون رمز نویسی قوی است، ولی از آنجایی که این اتفاق به ندرت میافتد میتوانیم از آن استفاده کنیم:

حالا داده ها را به دیتابیس اضافه می کنیم. برای ساده بودن کار، در این مثال تنها از نام کاربری، کلمه عبور و نمک استفاده خواهم کرد:

و این تقریبا تمام کار است.

نمکپاشی کلمه عبور در PHP

در PHP این کار ساده تر است، چرا که توابع پیش فرض password_hash() و password_verify() به صورت خودکار از نمک استفاده میکنند و رمزنگاری شده ی رشته به همراه نمکش بازگردانده می شود، پس حتی نیاز به ستونی مجزا در دیتابیس نیز نداریم (یا یک فیلد در NoSQL). چیزی مشابه زیر:

برای بررسی ورود، کافیست تابع password_verify() را صدا بزنید. این تابع به صورت خودکار نمک را از عبارت رمزنگاری شده جدا میکند، تنها کافیست شما کلمه عبور وارد شده و عبارت داخل دیتابیس را به تابع بفرسید. کُد مورد نیاز برای این کار در زیر آمده است:

POSIX: سطح دسترسی هایی که نیاز ندارید را حذف کنیم

این یکی از بهترین دفاع ها برای حفاظت از سرور و کاربرانش است. سطح دسترسی های بالایی برای انجام برخی کارها نیاز است، مخصوصا گوش دادن به پُرت های زیر ۱۰۲۴ یا دست کاری در فایل های سیستمی. ولی هیچ وقت نباید یک اپلیکیشن را به عنوان کاربر اصلی اجرا کنید، زمانی که نیازی به آن ندارد، در شرایطی که حمله کننده یک باگ در کُد شما پیدا کند که به او اجازه ی اجرای دستور بر روی سرور را بدهد، اگر اپلیکیشن توسط کابری با سطح دسترسی بالا اجرا شده باشد، همه چیز تمام است. حمله کننده هر کاری که بخواهد می کند و احتمالا قبل از اینکه متوجه شوید کارش تمام شده است. به همین دلیل است که باید سطح دسترسی را به محض امکان حذف کنید. در Node.js شبیه زیر خواهد بود:

تابع process.setuid() هویت کاربر را در پروسه ی محول شده به آن تغییر می دهد - این هویت هم می تواند یک ID عددی باشد یا یک نام کاربری (در حالت دوم این تابع اگر ID کاربر را بگیرد قفل می شود). سطح دسترسی کاربر باید حداقل باشد و تنها به فایل های مشخصی از اپلیکیشن دسترسی داشته باشد، تا ریسک دسترسی دادن به حمله کننده، به باقی بخش ها در سرور را محدود کنیم.

Aروش جایگزین: استفاده از authbind

برخی می گویند (برای مثال در این نظر در مورد حذف دسترسی اصلی) که راه حل بالا عالی نیست و ترجیح می دهند به جای آن از authbind استفاده کنند. این به تصمیم شما بستگی دارد که کدام را انتخاب می کنید و تا حد زیادی به تنظیماتتان نیز بستگی دارد. ولی به هر حال، authbind یک دستور است که با این هدف ساخته شده که به اپلیکیشن شما اجازه دسترسی به پُرت های کوچکتر از ۱۰۲۴ را بدون سطح دسترسی بالا بدهد (پس فقط مسئله پُرت ها را حل خواهد کرد). برای این کار اول یک فایل در /etc/authbind/byport/port ایجاد کنید، که port همان شماره پُرتی است که میخواهید توسط کاربری که از آن استفاده می کنید برای اجرای اپلیکیشن قابل اجرا باشد. بعد با کاربری که مشخص کرده اید وصل شوید و اپلیکیشن را مانند زیر اجرا کنید:

یا شبیه مثال زیر از کاربر با سطح دسترسی اصلی:

به وسیله این می توانید همان کاری که با POSIX انجام میدادید را انجام دهید، فقط اینبار به وسیله ی authbind، بستگی به ترجیح شما دارد.

نتیجه

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

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

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.