Content Provider digunakan oleh suatu aplikasi (atau self-app) untuk mengakses data dari aplikasi lainnya.
Contoh: App-1 memiliki database SQLite. Beberapa data dari App-1 akan dibagian kepada App-2. Dengan menggunakan Content Provider, App-2 dapat mengambil data yang ada di dalam database SQLite dari App-1. Operasi yang bisa dilakukan mencakup seperti yang ada di database SQLite pada umumnya.
Penjelasan lebih lanjut tentang Content Provider bisa Anda baca .
Penjelasan
Bagian aplikasi yang akan kita bahas kali ini memiliki Activity yang menampilkan Private Notes. Untuk mengakses Private Notes kita harus menginputkan 4 Digit PIN yang valid. Kita akan mencoba untuk mengakses data Private Notes tersebut dari luar aplikasi.
Melihat AndroidManifest.xml
Berikut adalah file AndroidManifest.xml dari aplikasi diva:
Terdapat Provider bernama NotesProvider, yang bisa dipanggil dengan atribut authorities="jakhar.aseem.diva.provider.notesprovider", dengan pengaturan exported="true" yang berarti diizinkannya akses dari aplikasi eksternal tanpa ada pembatasan.
Karena fitur Private Notes ini memiliki pengamanan berupa PIN yang dibuat oleh user, seharusnya aplikasi eksternal tidak bisa mengaksesnya.
Melihat Source Code
Sekarang mari kita cari Java class dimana Content Provider digunakan secara internal, yaitu pada file AccessControl3NotesActivity.java.
Perhatikan baris ke-21. Terdapat form query dengan parameter NotesProvider.CONTENT_URI, ini berarti ada class NotesProvider.java yang berisi nilai CONTENT_URI.
NotesProvider.java
...
...
public class NotesProvider extends ContentProvider {
static final String AUTHORITY = "jakhar.aseem.diva.provider.notesprovider";
static final Uri CONTENT_URI = Uri.parse("content://jakhar.aseem.diva.provider.notesprovider/notes");
...
...
Dengan informasi di atas kita bisa mengetahui nilai CONTENT_URI yang bisa diakses, yaitu content://jakhar.aseem.diva.provider.notesprovider/notes.
Mengakses Private Notes
Setelah mengetahui alamat atau nilai dari CONTENT_URI yang bisa diakses, kita akan mencoba untuk mendapatkan data dari Private Notes milik user menggunakan perintah berikut:
Dan hasilnya isi dari Private Notes bisa diakses dari luar aplikasi dikarenakan pengaturan exported="true". Ini membuktikan aplikasi tersebut tidak menyimpan Private Notes dengan aman.
Hal ini bisa kita dilakukan pada perangkat yang tidak di-root.
Kesimpulan
Terdapat fitur Private Notes yang datanya bisa didapatkan dari luar aplikasi karena pengaturan provider exported="true" pada AndroidManifest.xml.
Menyadari fakta tersebut, terdapat beberapa rekomendasi yang bisa developer lakukan, diantaranya:
Jangan pernah menggunakan exported="true" pada file AndroidManfiest.xml, kecuali Anda paham dengan apa yang Anda lakukan.
Jika Anda ingin membuat Content Provider agar data hanya bisa dibaca oleh aplikasi lain, pastikan untuk tidak memberikan izin untuk mengedit data (write).
kita telah mempelajari cara mendapatkan file AndroidManifest.xml dari suatu APK.