Activity adalah komponen yang dapat dilihat oleh pengguna, sehingga mereka dapat berinteraksi dengan aplikasi.
Bila dibandingkan dengan aplikasi web dan desktop, Activity sama seperti halaman dan form.
Android
Web
Desktop
Activity
Halaman
Form
Penjelasan lebih lanjut tentang Activity bisa Anda baca .
Intent adalah sebuah kelas dalam programming Android yang berfungsi untuk perpindahan halaman.
Intent juga merupakan suatu objek yang terdapat dalam suatu activity dimana objek tersebut dapat berkomunikasi dengan activity yang lain, baik activity pada fungsi internal android misal seperti memanggil activity dalam satu package atau beda package yang masih berada dalam satu project.
Intent dibagi menjadi 2, yaitu :
Explicit Intent berfungsi untuk mengaktifkan komponen-komponen dalam satu aplikasi yang sama. Misalnya seperti: berpindah Activity.
Implicit Intent berfungsi untuk memanggil fungsi activity yang sudah ada di fungsi internal Android seperti Dial Number, Open Browser dan lainnya.
Penjelasan lebih lanjut tentang Intents bisa Anda baca .
Penting untuk mempertimbangkan apakah aplikasi eksternal bisa mengakses Activitiy yang ada pada aplikasi kita atau tidak.
Katakanlah kita memiliki Activity yang di dalamnya terdapat informasi sensitif, maka dari itu seharusnya kita tidak mengizinkan aplikasi lain untuk mengakses Activity tersebut. Hal ini bisa dilakukan dengan membatasi akses melalui Intent Filter pada AndroidManifest.xml. File berisi detail untuk semua Activity termasuk untuk menerapkan Intent Filter.
Penjelasan
Bagian aplikasi yang akan kita bahas kali ini memiliki Activity yang menampilkan API Credentials. Kita akan mencari tahu apakah Activity ini bisa diakses dari luar aplikasi atau tidak.
Melihat Source Code
AccessControl1Activity.class
package jakhar.aseem.diva;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
public class AccessControl1Activity extends AppCompatActivity {
protected void onCreate(Bundle paramBundle) {
super.onCreate(paramBundle);
setContentView(2130968601);
}
public void viewAPICredentials(View paramView) {
Intent intent = new Intent();
intent.setAction("jakhar.aseem.diva.action.VIEW_CREDS");
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
return;
}
Toast.makeText((Context)this, "Error while getting API details", 0).show();
Log.e("Diva-aci1", "Couldn't resolve the Intent VIEW_CREDS to our activity");
}
}
Perhatikan fungsi viewAPICredentials(). Ketika kita menekan button "VIEW API CREDENTIALS" maka Intents akan memanggil ActivityVIEW_CREDS yang akan menampilkan APIcredentials.
Melihat AndroidManifest.xml
Berikut adalah file AndroidManifest.xml dari aplikasi diva:
Kita akan mencoba untuk memanggil ActivityAPICredsActivity. Untuk melakukan hal ini kita tidak memerlukan perangkat yang di-root.
Dengan masuk ke ADB Shell dan menggunakan perintah am (Activity Manager) kita akan memanggil Activity tersebut, seperti berikut:
am start jakhar.aseem.diva/.APICredsActivity
Maka akan tampil ActivityVIEW_CREDS seperti berikut:
Tampilnya ActivityVIEW_CREDS membuktikan bahwa Activity yang menyimpan informasi sensitif tersebut bisa diakses dari luar aplikasi.
Kesimpulan
Terdapat Activity yang menyimpan informasi sensitif dapat dipanggil dari luar aplikasi karena pengaturan Intent Filter yang buruk.
Menyadari fakta tersebut, terdapat beberapa rekomendasi yang bisa developer lakukan, diantaranya:
Mengatur action dan category yang benar pada Intent Filter.
Jangan pernah menggunakan exported="true" pada file AndroidManfiest.xml, kecuali Anda paham dengan apa yang Anda lakukan.
kita telah mempelajari cara mendapatkan file AndroidManifest.xml dari suatu APK.
Perhatikan pada baris ke-21 hingga 26. ActivityAPICredsActivity memiliki Intent untuk memanggil ActivityVIEW_CREDS dengan CategoryDEFAULT yang berarti bahwa ActivityVIEW_CREDS bisa dan akan dimuat pertama kali ketika ActivityAPICredsActivity dipanggil.