Sama seperti kita akan memanggil Activity dari luar aplikasi, hanya saja kali ini kita akan menggunakan data untuk mem-bypassaccess control yang ada.
Penjelasan
Bagian aplikasi yang akan kita bahas kali ini memiliki Activity yang menampilkan API Credentials. Untuk menampilkan API Credentials tersebut kita harus memilih opsi "Already Registered" terlebih dahulu baru menekan button "VIEW TVEETER API CREDENTIALS". Kita akan mencari tahu apakah Activity tersebut bisa diakses dari luar aplikasi atau tidak.
Melihat Source Code
AccessControl2Activity.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.RadioButton;
import android.widget.Toast;
public class AccessControl2Activity extends AppCompatActivity {
protected void onCreate(Bundle paramBundle) {
super.onCreate(paramBundle);
setContentView(2130968602);
}
public void viewAPICredentials(View paramView) {
RadioButton radioButton = (RadioButton)findViewById(2131492973);
Intent intent = new Intent();
boolean bool = radioButton.isChecked();
intent.setAction("jakhar.aseem.diva.action.VIEW_CREDS2");
intent.putExtra(getString(2131099686), bool);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
return;
}
Toast.makeText((Context)this, "Error while getting Tveeter API details", 0).show();
Log.e("Diva-aci1", "Couldn't resolve the Intent VIEW_CREDS2 to our activity");
}
}
Perhatikan fungsi viewAPICredentials(). Ketika opsi (radio button) diisi lalu button "VIEW TVEETER API CREDENTIALS" ditekan, maka Intents akan memanggil Activity VIEW_CREDS2 yang akan menampilkan API credentials.
Melihat AndroidManifest.xml
Berikut adalah file AndroidManifest.xml dari aplikasi diva:
Intent i = getIntent();
boolean bcheck = i.getBooleanExtra(getString(R.string.chk_pin), true);
if (bcheck == false) {
// Connect to vendor cloud and send User PIN
// Get API credentials and other confidential details of the user
String apidetails = "TVEETER API Key: secrettveeterapikey\nAPI User name: diva2\nAPI Password: p@ssword2";
// Display the details on the app
apicview.setText(apidetails);
}
else {
apicview.setText("Register yourself at http://payatu.com to get your PIN and then login with that PIN!");
pintext.setVisibility(View.VISIBLE);
vbutton.setVisibility(View.VISIBLE);
}
Baris ke-4 hingga 15: terdapat validasi jika bcheck bernilai false, maka Activity tersebut akan menampilkan API Credentials. Sedangkan jika bernilai true, maka akan menampilkan form register.
Memanggil Intent
Karena kita harus membuat nilai check_pin menjadi false, maka kita akan gunakan perintah seperti berikut:
am start -a jakhar.aseem.diva.VIEW_CREDS2 -n jakhar.aseem.diva/.APICreds2Activity --ez check_pin false
Keterangan:
start -a jakhar.aseem.diva.VIEW_CREDS2 mendefinisikan Action (bisa dilihat di file AndroidManifest.xml)
-n jakhar.aseem.diva/.APICreds2Activity menentukan Activity yang dijalankan.
–ez check_pin false mengisi nilai false pada identifiercheck_pin
–ez = data boolean
-es = data string
–ei = data integer
–el = data long
–ef = data float
–eu = data URI
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.
Tidak hanya melakukan validasi pada sisi client, tetapi juga pada sisi server.
kita telah mempelajari cara mendapatkan file AndroidManifest.xml dari suatu APK.
Perhatikan pada baris ke-28 hingga 33. ActivityAPICreds2Activity memiliki Intent untuk memanggil ActivityVIEW_CREDS2 dengan CategoryDEFAULT yang berarti bahwa ActivityVIEW_CREDS2 bisa dan akan dimuat pertama kali ketika ActivityAPICreds2Activity dipanggil.
Pengaturan untuk ActivityAPICreds2Activity pada AndroidManifest.xml memang terlihat sama seperi ActivityAPICredsActivity yang telah kita bahas sebelumnya. Tetapi jika kita memanggil ActivityAPICreds2Activity seperti cara , maka yang akan tampil adalah form untuk register.
Alasanya bisa kita cek di , seperti berikut:
Baris ke-2:i.getBooleanExtra(...) yang berarti Intent bergantung nilai boolean dari variabel bcheck. Dan chk_pin adalah singkatan dari "check_pin" (bisa Anda lihat di file ).