امنیت برنامه خود را بهبود بخشید، امنیت برنامه خود را بهبود بخشید، امنیت برنامه خود را بهبود بخشید

با ایمن‌تر کردن برنامه خود، به حفظ اعتماد کاربر و یکپارچگی دستگاه کمک می‌کنید.

این صفحه چندین روش برتر را ارائه می دهد که تأثیر مثبت و قابل توجهی بر امنیت برنامه شما دارد.

برقراری ارتباط امن

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

از ارتباط بین برنامه ها محافظت کنید

برای برقراری ارتباط امن‌تر بین برنامه‌ها، از اهداف ضمنی با انتخابگر برنامه، مجوزهای مبتنی بر امضا و ارائه‌دهندگان محتوای غیرصادراتی استفاده کنید.

انتخابگر برنامه را نشان دهید

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

کاتلین

val intent = Intent(Intent.ACTION_SEND)
val possibleActivitiesList: List<ResolveInfo> =
        packageManager.queryIntentActivities(intent, PackageManager.MATCH_ALL)

// Verify that an activity in at least two apps on the user's device
// can handle the intent. Otherwise, start the intent only if an app
// on the user's device can handle the intent.
if (possibleActivitiesList.size > 1) {

    // Create intent to show chooser.
    // Title is something similar to "Share this photo with."

    val chooser = resources.getString(R.string.chooser_title).let { title ->
        Intent.createChooser(intent, title)
    }
    startActivity(chooser)
} else if (intent.resolveActivity(packageManager) != null) {
    startActivity(intent)
}

جاوا

Intent intent = new Intent(Intent.ACTION_SEND);
List<ResolveInfo> possibleActivitiesList = getPackageManager()
        .queryIntentActivities(intent, PackageManager.MATCH_ALL);

// Verify that an activity in at least two apps on the user's device
// can handle the intent. Otherwise, start the intent only if an app
// on the user's device can handle the intent.
if (possibleActivitiesList.size() > 1) {

    // Create intent to show chooser.
    // Title is something similar to "Share this photo with."

    String title = getResources().getString(R.string.chooser_title);
    Intent chooser = Intent.createChooser(intent, title);
    startActivity(chooser);
} else if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}

اطلاعات مرتبط:

مجوزهای مبتنی بر امضا را اعمال کنید

هنگام به اشتراک گذاری داده ها بین دو برنامه ای که کنترل یا مالک آنها هستید، از مجوزهای مبتنی بر امضا استفاده کنید. این مجوزها نیازی به تأیید کاربر ندارند و در عوض بررسی کنید که برنام��‌هایی که به داده‌ها دسترسی دارند با استفاده از کلید امضای یکسان امضا شده باشند. بنابراین، این مجوزها یک تجربه کاربری ساده تر و امن تر را ارائه می دهند.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <permission android:name="my_custom_permission_name"
                android:protectionLevel="signature" />

اطلاعات مرتبط:

دسترسی به ارائه دهندگان محتوای برنامه خود را ممنوع کنید

مگر اینکه قصد ارسال داده ها از برنامه خود به برنامه دیگری را داشته باشید که متعلق به شما نیست، صراحتاً برنامه های توسعه دهندگان دیگر را از دسترسی به اشیاء ContentProvider برنامه خود منع کنید. این تنظیم به ویژه در صورتی مهم است که برنامه شما را بتوان روی دستگاه‌های دارای Android نسخه 4.1.1 (سطح API 16) یا پایین‌تر نصب کرد، زیرا ویژگی android:exported عنصر <provider> به‌طور پیش‌فرض در آن نسخه‌های Android true است.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application ... >
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.example.myapp.fileprovider"
            ...
            android:exported="false">
            <!-- Place child elements of <provider> here. -->
        </provider>
        ...
    </application>
</manifest>

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

هنگامی که از کاربران درخواست اعتبار می‌کنید تا بتوانند به اطلاعات حساس یا محتوای ممتاز در برنامه شما دسترسی داشته باشند، از یک پین/رمز عبور/الگو یا یک اعتبار بیومتریک مانند تشخیص چهره یا تشخیص اثر انگشت بخواهید.

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

اقدامات امنیتی شبکه را اعمال کنید

بخش‌های زیر نحوه بهبو�� امنیت شبکه برنامه خود را توضیح می‌دهند.

از ترافیک TLS استفاده کنید

اگر برنامه شما با وب سروری ارتباط برقرار می کند که دارای گواهی صادر شده توسط یک مرجع معتبر گواهی معتبر (CA) است، از یک درخواست HTTPS مانند موارد زیر استفاده کنید:

کاتلین

val url = URL("https://www.google.com")
val urlConnection = url.openConnection() as HttpsURLConnection
urlConnection.connect()
urlConnection.inputStream.use {
    ...
}

جاوا

URL url = new URL("https://www.google.com");
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.connect();
InputStream in = urlConnection.getInputStream();

یک پیکربندی امنیتی شبکه اضافه کنید

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

برای افزودن یک فایل پیکربندی امنیت شبکه به برنامه خود، این مراحل را دنبال کنید:

  1. پیکربندی را در مانیفست برنامه خود اعلام کنید:
  2. <manifest ... >
        <application
            android:networkSecurityConfig="@xml/network_security_config"
            ... >
            <!-- Place child elements of <application> element here. -->
        </application>
    </manifest>
  3. یک فایل منبع XML، واقع در res/xml/network_security_config.xml اضافه کنید.

    با غیرفعال کردن متن شفاف، مشخص کنید که تمام ترافیک به دامنه‌های خاص باید از HTTPS استفاده کند:

    <network-security-config>
        <domain-config cleartextTrafficPermitted="false">
            <domain includeSubdomains="true">secure.example.com</domain>
            ...
        </domain-config>
    </network-security-config>

    در طول فرآیند توسعه، می‌توانید از عنصر <debug-overrides> برای اجازه صریح گواهی‌های نصب‌شده توسط کاربر استفاده کنید. این عنصر بدون تأثیر بر پیکربندی انتشار برنامه، گزینه‌های مهم امنیتی برنامه شما را در حین اشکال‌زدایی و آزمایش لغو می‌کند. قطعه زیر نحوه تعریف این عنصر را در فایل XML پیکربندی امنیت شبکه برنامه خود نشان می دهد:

    <network-security-config>
        <debug-overrides>
            <trust-anchors>
                <certificates src="user" />
            </trust-anchors>
        </debug-overrides>
    </network-security-config>

اطلاعات مرتبط: پیکربندی امنیت شبکه

مدیر اعتماد خود را ایجاد کنید

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

  • شما در حال ارتباط با سرور وب هستید که دارای گواهی امضا شده توسط یک CA جدید یا سفارشی است.
  • دستگاهی که از آن استفاده می کنید به آن CA اعتماد ندارد.
  • شما نمی توانید از پیکربندی امنیت شبکه استفاده کنید.

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

اطلاعات مرتبط:

از اشیاء WebView با دقت استفاده کنید

اشیاء WebView در برنامه شما نباید به کاربران اجازه دهند به سایت هایی که خارج از کنترل شما هستند پیمایش کنند. در صورت امکان، از یک لیست مجاز برای محدود کردن محتوای بارگیری شده توسط اشیاء WebView برنامه خود استفاده کنید.

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

از کانال های پیام HTML استفاده کنید

اگر برنامه شما باید از پشتیبانی رابط جاوا اسکریپت در دستگاه‌های دارای Android نسخه 6.0 (سطح API 23) و بالاتر استفاده کند، به جای برقراری ارتباط بین وب‌سایت و برنامه خود، از کانال‌های پیام HTML استفاده کنید، همانطور که در قطعه کد زیر نشان داده شده است:

کاتلین

val myWebView: WebView = findViewById(R.id.webview)

// channel[0] and channel[1] represent the two ports.
// They are already entangled with each other and have been started.
val channel: Array<out WebMessagePort> = myWebView.createWebMessageChannel()

// Create handler for channel[0] to receive messages.
channel[0].setWebMessageCallback(object : WebMessagePort.WebMessageCallback() {

    override fun onMessage(port: WebMessagePort, message: WebMessage) {
        Log.d(TAG, "On port $port, received this message: $message")
    }
})

// Send a message from channel[1] to channel[0].
channel[1].postMessage(WebMessage("My secure message"))

جاوا

WebView myWebView = (WebView) findViewById(R.id.webview);

// channel[0] and channel[1] represent the two ports.
// They are already entangled with each other and have been started.
WebMessagePort[] channel = myWebView.createWebMessageChannel();

// Create handler for channel[0] to receive messages.
channel[0].setWebMessageCallback(new WebMessagePort.WebMessageCallback() {
    @Override
    public void onMessage(WebMessagePort port, WebMessage message) {
         Log.d(TAG, "On port " + port + ", received this message: " + message);
    }
});

// Send a message from channel[1] to channel[0].
channel[1].postMessage(new WebMessage("My secure message"));

اطلاعات مرتبط:

مجوزهای مناسب را ارائه دهید

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

از intent برای به تعویق انداختن مجوزها استفاده کنید

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

مثال زیر نشان می دهد که چگونه به جای درخواست مجوزهای READ_CONTACTS و WRITE_CONTACTS از یک قصد برای هدایت کاربران به برنامه مخاطبین استفاده کنید:

کاتلین

// Delegates the responsibility of creating the contact to a contacts app,
// which has already been granted the appropriate WRITE_CONTACTS permission.
Intent(Intent.ACTION_INSERT).apply {
    type = ContactsContract.Contacts.CONTENT_TYPE
}.also { intent ->
    // Make sure that the user has a contacts app installed on their device.
    intent.resolveActivity(packageManager)?.run {
        startActivity(intent)
    }
}

جاوا

// Delegates the responsibility of creating the contact to a contacts app,
// which has already been granted the appropriate WRITE_CONTACTS permission.
Intent insertContactIntent = new Intent(Intent.ACTION_INSERT);
insertContactIntent.setType(ContactsContract.Contacts.CONTENT_TYPE);

// Make sure that the user has a contacts app installed on their device.
if (insertContactIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(insertContactIntent);
}

علاوه بر این، اگر برنامه شما نیاز به انجام I/O مبتنی بر فایل دارد - مانند دسترسی به فضای ذخیره یا انتخاب یک فایل - به مجوزهای خاصی نیاز ندارد زیرا سیستم می تواند از طرف برنامه شما عملیات را تکمیل کند. با این حال بهتر است، پس از اینکه کاربر محتوا را در یک URI خاص انتخاب کرد، برنامه تماس با منبع انتخابی مجوز دریافت می کند.

اطلاعات مرتبط:

داده ها را به طور ایمن در بین برنامه ها به اشتراک بگذارید

برای به اشتراک گذاشتن محتوای برنامه خود با سایر برنامه ها به شیوه ای امن تر، این بهترین شیوه ها را دنبال کنید:

  • در صورت نیاز مجوزهای فقط خواندنی یا نوشتنی را اعمال کنید.
  • با استفاده از پرچم‌های FLAG_GRANT_READ_URI_PERMISSION و FLAG_GRANT_WRITE_URI_PERMISSION ، دسترسی یک‌باره به داده‌ها را برای مشتریان فراهم کنید.
  • هنگام به اشتراک گذاری داده ها، از URI های content:// استفاده کنید، نه از URI های file:// . نمونه های FileProvider این کار را برای شما انجام می دهند.

قطعه کد زیر نحوه استفاده از پرچم‌های اعطای مجوز URI و مجوزهای ارائه‌دهنده محتوا را برای نمایش فایل PDF یک برنامه در یک برنامه نمایشگر PDF جداگانه نشان می‌دهد:

کاتلین

// Create an Intent to launch a PDF viewer for a file owned by this app.
Intent(Intent.ACTION_VIEW).apply {
    data = Uri.parse("content://com.example/personal-info.pdf")

    // This flag gives the started app read access to the file.
    addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}.also { intent ->
    // Make sure that the user has a PDF viewer app installed on their device.
    intent.resolveActivity(packageManager)?.run {
        startActivity(intent)
    }
}

جاوا

// Create an Intent to launch a PDF viewer for a file owned by this app.
Intent viewPdfIntent = new Intent(Intent.ACTION_VIEW);
viewPdfIntent.setData(Uri.parse("content://com.example/personal-info.pdf"));

// This flag gives the started app read access to the file.
viewPdfIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

// Make sure that the user has a PDF viewer app installed on their device.
if (viewPdfIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(viewPdfIntent);
}

توجه: اجرای فایل‌ها از فهرست اصلی برنامه قابل نوشتن، نقض W^X است. به همین دلیل، برنامه‌های غیرقابل اعتمادی که اندروید 10 (سطح API 29) و بالاتر را هدف قرار می‌دهند، نمی‌توانند exec() روی فایل‌های داخل فهرست اصلی برنامه فراخوانی کنند، فقط کد باینری را که در فایل APK برنامه جاسازی شده است. علاوه بر این، برنامه‌هایی که اندروید 10 و بالاتر را هدف قرار می‌دهند، نمی‌توانند در حافظه، کدهای اجرایی فایل‌هایی را که با dlopen() باز شده‌اند، تغییر دهند. این شامل هر فایل اشتراک گذاری شده ( .so ) با جابجایی متن می شود.

اطلاعات مرتبط: android:grantUriPermissions

داده ها را با خیال راحت ذخیره کنید

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

داده های خصوصی را در حافظه داخلی ذخیره کنید

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

قطعه کد زیر یک راه برای نوشتن داده ها در حافظه داخلی را نشان می دهد:

کاتلین

// Creates a file with this name, or replaces an existing file
// that has the same name. Note that the file name cannot contain
// path separators.
val FILE_NAME = "sensitive_info.txt"
val fileContents = "This is some top-secret information!"
File(filesDir, FILE_NAME).bufferedWriter().use { writer ->
    writer.write(fileContents)
}

جاوا

// Creates a file with this name, or replaces an existing file
// that has the same name. Note that the file name cannot contain
// path separators.
final String FILE_NAME = "sensitive_info.txt";
String fileContents = "This is some top-secret information!";
try (BufferedWriter writer =
             new BufferedWriter(new FileWriter(new File(getFilesDir(), FILE_NAME)))) {
    writer.write(fileContents);
} catch (IOException e) {
    // Handle exception.
}

قطعه کد زیر عملکرد معکوس را نشان می دهد که داده ها را از حافظه داخلی می خواند:

کاتلین

val FILE_NAME = "sensitive_info.txt"
val contents = File(filesDir, FILE_NAME).bufferedReader().useLines { lines ->
    lines.fold("") { working, line ->
        "$working\n$line"
    }
}

جاوا

final String FILE_NAME = "sensitive_info.txt";
StringBuffer stringBuffer = new StringBuffer();
try (BufferedReader reader =
             new BufferedReader(new FileReader(new File(getFilesDir(), FILE_NAME)))) {

    String line = reader.readLine();
    while (line != null) {
        stringBuffer.append(line).append('\n');
        line = reader.readLine();
    }
} catch (IOException e) {
    // Handle exception.
}

اطلاعات مرتبط:

داده ها را بر اساس موارد استفاده در حافظه خارجی ذخیره کنید

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

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

اگر برنامه شما نیاز به دسترسی یا ذخیره فایلی دارد که برای سایر برنامه ها ارزش ارائه می کند، بسته به مورد استفاده خود از یکی از API های زیر استفاده کنید:

  • فایل‌های رسانه: برای ذخیره و دسترسی به تصاویر، فایل‌های صوتی و ویدیوهایی که بین برنامه‌ها به اشتراک گذاشته شده‌اند، از Media Store API استفاده کنید .
  • فایل های دیگر: برای ذخیره و دسترسی به انواع دیگر فایل های به اشتراک گذاشته شده، از جمله فایل های دانلود شده، از Storage Access Framework استفاده کنید .

در دسترس بودن حجم ذخیره سازی را بررسی کنید

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

بررسی اعتبار داده ها

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

قطعه کد زیر شامل نمونه ای از تأیید کننده هش است:

کاتلین

val hash = calculateHash(stream)
// Store "expectedHash" in a secure location.
if (hash == expectedHash) {
    // Work with the content.
}

// Calculating the hash code can take quite a bit of time, so it shouldn't
// be done on the main thread.
suspend fun calculateHash(stream: InputStream): String {
    return withContext(Dispatchers.IO) {
        val digest = MessageDigest.getInstance("SHA-512")
        val digestStream = DigestInputStream(stream, digest)
        while (digestStream.read() != -1) {
            // The DigestInputStream does the work; nothing for us to do.
        }
        digest.digest().joinToString(":") { "%02x".format(it) }
    }
}

جاوا

Executor threadPoolExecutor = Executors.newFixedThreadPool(4);
private interface HashCallback {
    void onHashCalculated(@Nullable String hash);
}

boolean hashRunning = calculateHash(inputStream, threadPoolExecutor, hash -> {
    if (Objects.equals(hash, expectedHash)) {
        // Work with the content.
    }
});

if (!hashRunning) {
    // There was an error setting up the hash function.
}

private boolean calculateHash(@NonNull InputStream stream,
                              @NonNull Executor executor,
                              @NonNull HashCallback hashCallback) {
    final MessageDigest digest;
    try {
        digest = MessageDigest.getInstance("SHA-512");
    } catch (NoSuchAlgorithmException nsa) {
        return false;
    }

    // Calculating the hash code can take quite a bit of time, so it shouldn't
    // be done on the main thread.
    executor.execute(() -> {
        String hash;
        try (DigestInputStream digestStream =
                new DigestInputStream(stream, digest)) {
            while (digestStream.read() != -1) {
                // The DigestInputStream does the work; nothing for us to do.
            }
            StringBuilder builder = new StringBuilder();
            for (byte aByte : digest.digest()) {
                builder.append(String.format("%02x", aByte)).append(':');
            }
            hash = builder.substring(0, builder.length() - 1);
        } catch (IOException e) {
            hash = null;
        }

        final String calculatedHash = hash;
        runOnUiThread(() -> hashCallback.onHashCalculated(calculatedHash));
    });
    return true;
}

فقط داده های غیر حساس را در فایل های کش ذخیره کنید

برای دسترسی سریع‌تر به داده‌های برنامه غیرحساس، آن‌ها را در حافظه پنهان دستگاه ذخیره کنید. برای کش های بزرگتر از 1 مگابایت، از getExternalCacheDir() استفاده کنید. برای کش های 1 مگابایتی یا کوچکتر، از getCacheDir() استفاده کنید. هر دو روش شی File را در اختیار شما قرار می دهند که حاوی داده های حافظه پنهان برنامه شما است.

قطعه کد زیر نحوه کش کردن فایلی را که برنامه شما اخیراً دانلود کرده است نشان می دهد:

کاتلین

val cacheFile = File(myDownloadedFileUri).let { fileToCache ->
    File(cacheDir.path, fileToCache.name)
}

جاوا

File cacheDir = getCacheDir();
File fileToCache = new File(myDownloadedFileUri);
String fileToCacheName = fileToCache.getName();
File cacheFile = new File(cacheDir.getPath(), fileToCacheName);

توجه: اگر از getExternalCacheDir() برای قرار دادن حافظه پنهان برنامه خود در فضای ذخیره سازی مشترک استفاده می کنید، کاربر ممکن است رسانه حاوی این فضای ذخیره سازی را در حین اجرای برنامه شما خارج کند. منطقی را برای رسیدگی به فقدان حافظه پنهان که این رفتار کاربر باعث می شود، لحاظ کنید.

احتیاط: هیچ امنیتی روی این فایل ها اعمال نمی شود. بنابراین، هر برنامه‌ای که اندروید 10 (سطح API 29) یا پایین‌تر را هدف قرار می‌دهد و دارای مجوز WRITE_EXTERNAL_STORAGE است، می‌تواند به محتوای این کش دسترسی داشته باشد.

اطلاعات مرتبط: مروری بر ذخیره سازی داده ها و فایل ها

از SharedPreferences در حالت خصوصی استفاده کنید

هنگام استفاده از getSharedPreferences() برای ایجاد یا دسترسی به اشیاء SharedPreferences برنامه خود، از MODE_PRIVATE استفاده کنید. به این ترتیب، فقط برنامه شما می‌تواند به اطلاعات موجود در فایل اولویت‌های مشترک دسترسی داشته باشد.

اگر می‌خواهید داده‌ها را بین برنامه‌ها به اشتراک بگذارید، از اشیاء SharedPreferences استفاده نکنید. درعوض، مراحل اشتراک‌گذاری ایمن داده‌ها را در بین برنامه‌ها دنبال کنید.

کتابخانه Security همچنین کلاس EncryptedSharedPreferences را ارائه می دهد که کلاس SharedPreferences را می پوشاند و به طور خودکار کلیدها و مقادیر را رمزگذاری می کند.

اطلاعات مرتبط:

خدمات و وابستگی ها را به روز نگه دارید

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

ارائه دهنده امنیت خدمات Google Play را بررسی کنید

توجه: این بخش فقط برای برنامه هایی اعمال می شود که دستگاه هایی را هدف قرار می دهند که سرویس های Google Play را نصب کرده اند.

اگر برنامه شما از خدمات Google Play استفاده می‌کند، مطمئن شوید که در دستگاهی که برنامه شما در آن نصب شده است، به‌روزرسانی شده باشد. بررسی را به صورت ناهمزمان، خارج از رشته UI انجام دهید. اگر دستگاه به‌روز نیست، خطای مجوز را راه‌اندازی کنید.

برای تعیین اینکه آیا خدمات Google Play در دستگاهی که برنامه شما در آن نصب شده است به روز است یا خیر، مراحل موجود در راهنمای مربوط به به روز رسانی ارائه دهنده امنیت خود را برای محافظت در برابر سوء استفاده های SSL دنبال کنید.

اطلاعات مرتبط:

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

قبل از استقرار برنامه خود، مطمئن شوید که همه کتابخانه ها، SDK ها و سایر وابستگی ها به روز هستند:

  • برای وابستگی های شخص اول، مانند Android SDK، از ابزارهای به روز رسانی موجود در Android Studio، مانند مدیر SDK استفاده کنید.
  • برای وابستگی‌های شخص ثالث، وب‌سایت‌های کتابخانه‌هایی را که برنامه‌تان استفاده می‌کند بررسی کنید و هرگونه به‌روزرسانی و وصله امنیتی موجود را نصب کنید.

اطلاعات مرتبط: افزودن وابستگی های ساخت

اطلاعات بیشتر

برای آشنایی بیشتر با نحوه ایمن‌تر کردن برنامه خود، منابع زیر را مشاهده کنید: