تخصصی- امنیت در برنامه نویسی، چگونه کد امنی بنویسیم؟

3
271
تخصصی- امنیت در برنامه نویسی، چگونه کد امنی بنویسیم؟

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

در ادامه به عادت‌های خوب برنامه‌ نویسی‌ای که رعایت آنها باعث می‌شود، کدهای نوشته شده از حملات خرابکارها تا حدود زیادی در امان باشد، اشاره می‌کنیم.( در این مقاله ۳ مورد اول را بررسی کرده، و در مقاله بعدی مرتبط ۴ مورد بعدی را مورد بررسی قرار خواهیم داد.)

  • اعتبار سنجی ورودی کاربر
  • محافظت در برابر حملات XSS
  • محافظت در برابر حملات CSRF
  • جلوگیری از حملات تزریق SQL
  • حفاظت از File system ها
  • حفاظت از فایل‌های Session
  • کنترل رفع خطا
  • امنیت فایل‌ها

اعتبار سنجی داده‌‌های ورودی کاربر

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

همیشه در برنامه‌هایتان اعتبارسنجی داده‌ها را لحاظ کنید. اگر از جاوا اسکریپت برای این کار استفاده می‌کنید، احتمال این هست که کاربر در مرورگرش جاوا اسکریپت را غیرفعال کرده باشد.  در این مورد، برنامه شما نمی تواند داده‌های کاربر را اعتبار سنجی کند. هر چند validate کردن با جاوا اسکریپت رایج است، ولی برای رفع کردن این نوع مشکل‌ها، داده‌های ورودی را باید دوباره با زبانی برنامه‌نویسی‌ای که می‌نویسید، برای نمونه PHP بررسی کنید.

محافظت در برابر حملات XSS

حمله XSS یا Cross-site scripting، حمله‌ای است بر پایه تزریق کد به صفحات وب‌سایت آسیب پذیر. و این در نتیجه قبول داده‌های ورودی کاربر بدون کنترل و اعتبارسنجی و در نتیجه نمایش آنها در مرورگر می‌باشد. فرض کنید در نرم‌افزار یا اپلیکیشن خود فرم نظر خواهی (Comment) دارید که کاربر می‌تواند آن را پر کند، و بعد از ارسال موفقیت آمیز، نظرات نشان داده می‌شوند.

کاربر می‌تواند نظر خود را که شامل کد مخرب جاوا اسکریپت است، در فرم وارد و ارسال کند. وقتی دکمه Submit را می‌زند، داده‌ها به سرور فرستاده و در پایگاه داده ذخیره می‌شوند. پس از آن، نظر کاربر از پایگاه داده واکشی (fetch) شده و در صفحه html سایت نشان داده شده و کد جاوا اسکریپت اجرا می‌شود. کد مخرب جاوا اسکریپت ممکن است کاربر را به صفحه وب‌سایت مخرب یا فیشینگ هدایت کند.

برای حفاظت برنامه‌تان از این نوع حمله، می‌توانید داده‌های ورودی را از تابع strip_tags عبور دهید. این تابع تمام tag‌های html متن فرستاده شده را پاک می‌کند. و به هنگام نمایش روی مرورگر، روی داده تابع htmlentities را اعمال کنید.

محافظت در برابر حملات CSRF

در حمله CSRF یا همان Cross Site Request Forgery، حمله کننده، قربانی را با نیرنگ قانع می‌کند تا اطلاعات حساس و مهم را در سایت یا نرم‌افزار بارگذاری کند و یا تراکنشی را ناخواسته انجام دهد.  این معمولا در اپلیکیشن‌هایی که نادرست کد زده‌ شده‌اند رخ می‌دهد. برای نمونه استفاده نادرست از درخواست GET.

در حالت ایده‌آل، درخواست GET برای Idempotent استفاده می‌شود. Idempotent به معنی است که صفحه‌ای می‌تواند چندین بار، بدون ایجاد هر گونه عوارض جانبی در دسترس قرار بگیرد.  بنابراین درخواست GET فقط باید برای دسترسی به اطلاعات مورد استفاده قرار بگیرد، نه برای انجام تراکنش.

مثال زیر نشان می‌دهد که چطور یک کد نا امن می‌تواند راهی برای حمله CSRF باشد :

<?php
if (isset($_REQUEST["name"], $_REQUEST["amount"])) {
    // process the request and transfer the amount from
    // from the logged in user to the passed name.
}

بیایید فرض کنیم، سارا می‌خواهد روی علی حمله CSRF را انجام دهد. برای این منظور یک URL مانند زیر می‌سازد، و آن را به ایمیل علی ارسال می‌کند :

<a href="http://example.com/process.php?name=Sara&amount=1000">Visit My WebSite</a>

اگر علی روی لینک کلیک کند، در حالی که در اپلیکیشن یا وب‌سایت وارد شده باشد (log in)، هزار دلار از حساب علی کسر و به حساب سارا اضافه می‌شود. اگر چه سارا می‌تواند یک عکس لینک دار نیز مانند زیر بسازد :

<img src="http://example.com/process.php?name=Sara&amount=1000" width="1" height="1"/>

مرورگر نمی‌تواند عکسی را نشان دهد، ولی درخواست را بدون اطلاع علی اجرا می‌کند.

راه حل این است که از درخواست POST برای هر نوع تغییری در پایگاه داده استفاده کنیم، و از بکار بردن $_REQUEST اجتناب کنیم. برای پاس دادن پارامترهای GET از $_GET و برای پارامترهای POST از $_POST استفاده کنیم.

علاوه بر این، می‌توانید با ساختن یک توکن یا نشانه تصادفی به نام CSRF token برای هر درخواست POST، جلوی این نوع حمله را بگیرید. به این ترتیب که وقتی کاربر وارد حسابش می‌شود یک توکن تصادفی تولید و در نشست کاربر ذخیره شود. هر زمانی که فرمی به کاربر نشان داده شد، این توکن به عنوان یک فیلد ورودی مخفی در نظر گرفته شود، و اپلیکیشن این توکن را با توکن ذخیره شده در نشست کاربر مقایسه کند، که آیا مطابقت دارند یا نه.

مقاله قبلیامنیت اینترنت
مقاله بعدیامنیت در برنامه نویسی – بخش دوم

3 نظر

نظر بدهید

لطفا نظر خود را بنویسید
لطفا نام خود را اینجا وارد کنید

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.