آیا برنامه 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
کتابخانه، که شامل توابع رمزنگاری مختلف مانند هش کردن، رمزگذاری متقارن و رمزگذاری نامتقارن است.
-
ذخیره سازی محلی رمزگذاری: ذخیره سازی محلی مکانی است که ما داده ها را به صورت محلی روی دستگاه ذخیره می کنیم. بنابراین ما باید داده ها را قبل از ذخیره در حافظه محلی رمزگذاری کنیم. می توانید از بسته های زیر برای رمزگذاری داده ها قبل از ذخیره در حافظه محلی استفاده کنید.
-
اطلاعات رمزگذاری: داده های حساس مانند اعتبار کاربر، اطلاعات پرداخت و اطلاعات شخصی باید هم در حین انتقال و هم در حالت استراحت رمزگذاری شوند. Flutter دارای پشتیبانی داخلی برای رمزگذاری از طریق بسته هایی مانند رمزنگاری و رمزگذاری است.
احراز هویت فرآیند تأیید هویت یک کاربر است. دو نوع احراز هویت وجود دارد: سمت مشتری و سمت سرور. احراز هویت سمت کلاینت در سمت کلاینت و احراز هویت سمت سرور در سمت سرور انجام می شود. احراز هویت سمت سرور امن تر از احراز هویت سمت سرویس گیرنده است. بنابراین باید از احراز هویت سمت سرور استفاده کنیم. می توانید از بسته های زیر برای اجرای احراز هویت سمت سرور بر اساس نیاز خود استفاده کنید.
از آنجایی که احراز هویت سمت سرور امن تر است، اما اینطور نیست که احراز هویت محلی ایمن نباشد. بنابراین باید از احراز هویت محلی نیز استفاده کنیم. برای احراز هویت محلی، میتوانید از بیومتریک، پینها یا الگوها استفاده کنید.
احراز هویت محلی بیشتر در برنامه های بانکی یا برای هر برنامه مالی استفاده می شود.
تماس های شبکه:
ارتباطات شبکه باید با استفاده ایمن شود HTTPS
و SSL/TLS
پروتکل هایی برای جلوگیری از رهگیری و دستکاری داده ها و اطمینان از یکپارچگی داده ها. برای برقراری تماس شبکه می توانید از بسته های زیر استفاده کنید.
توجه: سعی کنید از برقراری تماس های شبکه از میزبانی که با http:// شروع می شود چشم پوشی کنید و سعی کنید از میزبانی که با https:// شروع می شود تماس های شبکه برقرار کنید.
آیا دستگاه امن است؟
هر برنامه بانکی یا برنامه مالی باید فقط روی یک دستگاه ایمن نصب شود.
چگونه می توانید بررسی کنید که آیا یک دستگاه وجود دارد؟ نشات گرفتن یا زندان شکست
برای بررسی روت بودن یا نبودن دستگاه می توانید از بسته های زیر استفاده کنید.
آیا برنامه شما می تواند مهندسی معکوس شود؟
بله، امکان مهندسی معکوس کد منبع وجود دارد. بنابراین ما باید کد منبع را مبهم کنیم. اگر ساخت اشکالزدایی را توزیع میکنید، اینجا را ببینید، مهندسی معکوس کد منبع آسان است. بنابراین ما باید نسخه انتشار را توزیع کنیم. اما هنوز هم امکان مهندسی معکوس کد منبع وجود دارد. بنابراین ما باید کد منبع را مبهم کنیم.
برای مبهم کردن کد منبع می توانید از دستور زیر استفاده کنید
flutter build apk --obfuscate --split-debug-info=debug_info
اطلاعات بیشتر در مورد مبهم سازی را اینجا بخوانید
بسته زیر safe_application، دید محتوای برنامه را هنگام خروج کاربران از برنامه ایمن می کند. محتوا را در تغییر دهنده برنامه پنهان می کند و هنگامی که کاربر برمی گردد، یک مانع یخ زدگی بالای محتوای قفل شده نمایش داده می شود.
بهترین روشها برای توسعه اپلیکیشن Flutter برای ایمنتر کردن آن
- اجتناب از استفاده از کتابخانه های شخص ثالث: همانطور که می دانیم فلاتر بسته های زیادی دارد تا کار ما را آسان کند، اما باید تا حد امکان از استفاده از کتابخانه های شخص ثالث خودداری کنیم. چون نمی دانیم داخل بسته چه خبر است. پس بهتر است فقط از بسته های قابل اعتماد استفاده کنید. قبل از استفاده از هر بسته، باید محبوبیت بسته و تعداد مشارکت کنندگان را بررسی کنیم. اگر بسته مشارکت کنندگان زیادی داشته باشد و افراد زیادی از آن استفاده کنند، استفاده از آن بی خطر است.
-
بارگذاری بیش از حد مجوزها: بارگذاری بیش از حد مجوزها تکنیکی است برای درخواست مجوزهای بیشتر از آنچه لازم است. به عنوان مثال، اگر می خواهید به دوربین دسترسی داشته باشید، باید فقط اجازه دوربین را بخواهید. اما اگر مجوز ذخیره سازی را نیز بخواهید، به آن مجوزهای اضافه بار می گویند. بنابراین ما باید تا حد امکان از بارگذاری بیش از حد مجوزها خودداری کنیم زیرا این یک عمل بد است و کاربران آن را دوست ندارند.
-
از متغیرها یا روشهای سراسری اجتناب کنید: برای مثال، اگر میخواهید یک توکن را از حافظه محلی بارگیری کنید، نباید آن را در یک متغیر جهانی ذخیره کنید. زیرا اگر آن را در یک متغیر جهانی ذخیره کنید، دسترسی به آن از هر جایی آسان است. بنابراین بهتر است آن را در یک متغیر محلی ذخیره کنید.
-
انجام تست های امنیتی: به طور منظم تست های امنیتی را برای شناسایی آسیب پذیری های احتمالی و اطمینان از موثر بودن اقدامات امنیتی انجام دهید. این می تواند شامل تست نفوذ، بررسی کد و اسکن آسیب پذیری باشد.
-
برنامه پاداش باگ را اضافه کنید: برنامه پاداش باگ راهی برای تشویق هکرهای اخلاقی برای یافتن و گزارش آسیبپذیریهای برنامه شما است. این می تواند راهی عالی برای یافتن آسیب پذیری هایی باشد که ممکن است از دست داده باشید. همچنین میتوانید برای یافتن آسیبپذیریها جایزه بدهید. این می تواند به شما کمک کند تا آسیب پذیری ها را قبل از اینکه توسط هکرهای مخرب مورد سوء استفاده قرار گیرند پیدا کنید.
-
استفاده از استاندارد کدنویسی امن: استاندارد کدنویسی ایمن مجموعه قوانینی است که توسعه دهندگان باید هنگام نوشتن کد رعایت کنند. این می تواند به اطمینان حاصل شود که توسعه دهندگان در حال نوشتن کد ایمن هستند و آسیب پذیری ها به پایگاه کد وارد نمی شوند. برای اطمینان از اینکه توسعهدهندگان از بهترین شیوهها پیروی میکنند و آسیبپذیریها به پایگاه کد وارد نمیشوند، میتوانید از یک استاندارد کدگذاری امن استفاده کنید.
-
برای انتشار از خط لوله استفاده کنید: برای انتشار از خط لوله استفاده کنید. خط لوله مجموعه ای از مراحل است که برای ساخت و انتشار برنامه انجام می شود. این می تواند شامل ساخت برنامه، اجرای آزمایش ها و استقرار برنامه باشد. این می تواند به اطمینان از ایمن بودن برنامه و عدم وارد شدن آسیب پذیری به برنامه کمک کند.
ابزارهای Pipeline مانند اکشن های GitHub، bitrise، circleci، Jenkins و غیره.
اقدام GitHub برای ساخت برنامه فلاتر و توزیع با استفاده از توزیع برنامه Firebase را اینجا بخوانید.
اگر چیزی را فراموش کردم می توانید آن را در بخش نظرات اضافه کنید، بعداً آن را اضافه خواهم کرد.
بیا دنبالم: