برنامه نویسی

آیا برنامه Flutter شما امن است؟ بهترین روش ها برای توسعه و استقرار برنامه های Flutter ایمن

من بیش از 2 سال است که روی فلاتر کار می کنم و بسیاری از توسعه دهندگان فلاتر را دیده ام که از مسائل امنیتی در فلاتر آگاه نیستند. بنابراین من تصمیم گرفتم این مقاله را بنویسم تا توسعه دهندگان فلاتر را از مسائل امنیتی در فلاتر آگاه کنم و چگونه می توانید برنامه خود را ایمن کنید، بنابراین بیایید شروع کنیم.

ایمن کردن کلیدهای API

API مخفف “Application Programming Interface” است. API مجموعه ای از قوانین، پروتکل ها و ابزارهایی است که نحوه تعامل اجزای نرم افزار را با یکدیگر تعریف می کند. به عبارت دیگر روشی است برای نرم افزارهای مختلف برای ارتباط و تبادل اطلاعات با یکدیگر.
ما می‌توانیم API را با کد سخت یا در دارت یا بومی (اندروید، iOS، وب) ایمن کنیم.

برای مثال، من باید از کلید API در کد دارت استفاده کنم

void main(){
  String API_KEY="********"; //bad practice
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای جلوگیری از این امر، می توانیم از String.fromEnvironment() یا استفاده کنیم .env فایل.

String.fromEnvironment() پیاده سازی

  void main(){
    String? apiKey = String.fromEnvironment('API_KEY', defaultValue: null); //get api key from environment
    runApp(MyApp(apiKey: apiKey));
  }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • هنگام کامپایل کد، کلید API را به عنوان یک متغیر محیطی ارسال کنید
  flutter build apk --dart-define==API_KEY=SECRET_KEY
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بارگیری کلید API از .env فایل

برای واکشی کلیدهای API از .env فایل از پکیج زیر استفاده کنید:

flutter_dotenv

توجه فراموش نکنید که آن را اضافه کنید .env فایل در .gitignore فایل

کلیدهای API در کد بومی

برای مثال، Google Map API باید در فایل‌های مربوطه به Android، iOS و وب اضافه شود، اما APIها در آن ایمن نیستند. AndroidManifest.xml، info.plist، و index.html.

افزودن نقشه گوگل برای بال زدن

اندروید:

  • کلید API خود را وارد کنید local.propertiesفایل
   google.maps_api_key=SECRET_KEY

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • فایل local.properties را اضافه کنید .gitignore فایل
  • حالا کلید API را بخوانید local.properties فایل در build.gradle(app) فایل.
    def localProperties = new Properties()
    def localPropertiesFile = rootProject.file('local.properties')
    if (localPropertiesFile.exists()) {
        localPropertiesFile.withReader('UTF-8') { reader ->
            localProperties.load(reader)
        }
    }
    def googleMapsApiKey = localProperties.getProperty("google.maps_api_key")
    android {
        defaultConfig {
            manifestPlaceholders = [
                    googleMapsApiKey: googleMapsApiKey
            ]
        }
    }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • و آن را به فایل AndroidManifest.xml خود اضافه کنید
    <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="${googleMapsApiKey}" />
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای iOS:

  • کلید API خود را به آن اضافه کنید ios/Flutter/Release.xcconfig فایل
     GOOGLE_MAPS_API_KEY=$(SECRET_KEY)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

   <key>google_maps_api_key</key>
    <string>$(GOOGLE_MAPS_API_KEY)</string>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • حالا آن را به خود اضافه کنید AppDelegate.swift فایل
    GMSServices.provideAPIKey("$(GOOGLE_MAPS_API_KEY)")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کمی پیچیده است اما می توانید به لینک زیر مراجعه کنید:

Dyanmic Html Elements- رویکردی به Flavors در Flutter Web توسط گونپالما

رمزگذاری اطلاعات و ذخیره سازی

رمزگذاری فرآیند تبدیل داده‌های متنی ساده به فرمت کدگذاری شده برای اطمینان از محرمانه بودن، یکپارچگی و امنیت داده‌ها است. در Flutter، رمزگذاری اغلب برای ایمن سازی داده های حساس مانند رمز عبور، اعتبار کاربر و اطلاعات مالی در برنامه های تلفن همراه استفاده می شود.

Flutter پشتیبانی داخلی برای رمزگذاری از طریق فراهم می کند dart:crypto کتابخانه، که شامل توابع رمزنگاری مختلف مانند هش کردن، رمزگذاری متقارن و رمزگذاری نامتقارن است.

میم 2

  • ذخیره سازی محلی رمزگذاری: ذخیره سازی محلی مکانی است که ما داده ها را به صورت محلی روی دستگاه ذخیره می کنیم. بنابراین ما باید داده ها را قبل از ذخیره در حافظه محلی رمزگذاری کنیم. می توانید از بسته های زیر برای رمزگذاری داده ها قبل از ذخیره در حافظه محلی استفاده کنید.

  • اطلاعات رمزگذاری: داده های حساس مانند اعتبار کاربر، اطلاعات پرداخت و اطلاعات شخصی باید هم در حین انتقال و هم در حالت استراحت رمزگذاری شوند. Flutter دارای پشتیبانی داخلی برای رمزگذاری از طریق بسته هایی مانند رمزنگاری و رمزگذاری است.

احراز هویت فرآیند تأیید هویت یک کاربر است. دو نوع احراز هویت وجود دارد: سمت مشتری و سمت سرور. احراز هویت سمت کلاینت در سمت کلاینت و احراز هویت سمت سرور در سمت سرور انجام می شود. احراز هویت سمت سرور امن تر از احراز هویت سمت سرویس گیرنده است. بنابراین باید از احراز هویت سمت سرور استفاده کنیم. می توانید از بسته های زیر برای اجرای احراز هویت سمت سرور بر اساس نیاز خود استفاده کنید.

از آنجایی که احراز هویت سمت سرور امن تر است، اما اینطور نیست که احراز هویت محلی ایمن نباشد. بنابراین باید از احراز هویت محلی نیز استفاده کنیم. برای احراز هویت محلی، می‌توانید از بیومتریک، پین‌ها یا الگوها استفاده کنید.

تصویر 2

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

تماس های شبکه:

ارتباطات شبکه باید با استفاده ایمن شود HTTPS و SSL/TLS پروتکل هایی برای جلوگیری از رهگیری و دستکاری داده ها و اطمینان از یکپارچگی داده ها. برای برقراری تماس شبکه می توانید از بسته های زیر استفاده کنید.

توجه: سعی کنید از برقراری تماس های شبکه از میزبانی که با http:// شروع می شود چشم پوشی کنید و سعی کنید از میزبانی که با https:// شروع می شود تماس های شبکه برقرار کنید.

آیا دستگاه امن است؟

هر برنامه بانکی یا برنامه مالی باید فقط روی یک دستگاه ایمن نصب شود.

چگونه می توانید بررسی کنید که آیا یک دستگاه وجود دارد؟ نشات گرفتن یا زندان شکست

برای بررسی روت بودن یا نبودن دستگاه می توانید از بسته های زیر استفاده کنید.

آیا برنامه شما می تواند مهندسی معکوس شود؟

تصویر 1

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

برای مبهم کردن کد منبع می توانید از دستور زیر استفاده کنید

flutter build apk --obfuscate --split-debug-info=debug_info
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

بسته زیر safe_application، دید محتوای برنامه را هنگام خروج کاربران از برنامه ایمن می کند. محتوا را در تغییر دهنده برنامه پنهان می کند و هنگامی که کاربر برمی گردد، یک مانع یخ زدگی بالای محتوای قفل شده نمایش داده می شود.

بهترین روش‌ها برای توسعه اپلیکیشن Flutter برای ایمن‌تر کردن آن

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

مثال

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

  • از متغیرها یا روش‌های سراسری اجتناب کنید: برای مثال، اگر می‌خواهید یک توکن را از حافظه محلی بارگیری کنید، نباید آن را در یک متغیر جهانی ذخیره کنید. زیرا اگر آن را در یک متغیر جهانی ذخیره کنید، دسترسی به آن از هر جایی آسان است. بنابراین بهتر است آن را در یک متغیر محلی ذخیره کنید.

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

  • برنامه پاداش باگ را اضافه کنید: برنامه پاداش باگ راهی برای تشویق هکرهای اخلاقی برای یافتن و گزارش آسیب‌پذیری‌های برنامه شما است. این می تواند راهی عالی برای یافتن آسیب پذیری هایی باشد که ممکن است از دست داده باشید. همچنین می‌توانید برای یافتن آسیب‌پذیری‌ها جایزه بدهید. این می تواند به شما کمک کند تا آسیب پذیری ها را قبل از اینکه توسط هکرهای مخرب مورد سوء استفاده قرار گیرند پیدا کنید.

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

  • برای انتشار از خط لوله استفاده کنید: برای انتشار از خط لوله استفاده کنید. خط لوله مجموعه ای از مراحل است که برای ساخت و انتشار برنامه انجام می شود. این می تواند شامل ساخت برنامه، اجرای آزمایش ها و استقرار برنامه باشد. این می تواند به اطمینان از ایمن بودن برنامه و عدم وارد شدن آسیب پذیری به برنامه کمک کند.
    ابزارهای Pipeline مانند اکشن های GitHub، bitrise، circleci، Jenkins و غیره.

اقدام GitHub برای ساخت برنامه فلاتر و توزیع با استفاده از توزیع برنامه Firebase را اینجا بخوانید.

اگر چیزی را فراموش کردم می توانید آن را در بخش نظرات اضافه کنید، بعداً آن را اضافه خواهم کرد.

میم 3

بیا دنبالم:

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا