7

我有 2 个应用程序。
如果我使用服务,我可以设置权限,因此只能app1将意图发送到app2:在( )
中定义权限,并在. 服务受该许可保护。 这样,只能在上向服务发送意图,其他应用(除非我的签名泄露)无法向服务上发送意图。app2protection level: signatureapp1
app2
app1app2app2

我可以对广播接收器做同样的事情吗?

  • app1:发送广播(意图,许可)
  • app2:定义权限,使用该权限。

据我了解使用 sendBroadcast(intent, permission),应用程序不需要“使用”权限。这意味着任何应用程序都可以向app2. 这些权限参数只检查了 app2,以避免其他应用程序收到此意图。(如果我删除,并使用定义的相同权限字符串app2安装 fake ,fake可以从 获得意图,这是出乎意料的)app2app2app1

顺便说一句,如果应用程序定义权限并自行使用,则 protectionLevel(signature) 似乎没有任何意义。这是真的?

现在,我可以设置额外的权限:

  • app1:定义权限,使用该权限。
  • app2:接收者仅限于该权限。

同样,如果一个人删除了app1,安装了假app1的具有相同的权限,那么假的app1可以发送假意图到app2。我能做些什么来防止app2收到虚假意图?

谢谢

4

2 回答 2

6

标签还可以定义广播者应该拥有的权限,请参见http://developer.android.com/guide/topics/manifest/receiver-element.html#prmsn

我的意思是你可以通过这样的编码来保护你的接收器免受未经授权的广播:

...
<permission android:name="com.yourapp.PERMISSION"
    android:protectionLevel="signature"
        android:label="@string/permission_label"
        android:description="@string/permission_desc">
</permission>
...

<receiver android:name=".MyReceiver"
    android:permission="com.yourapp.PERMISSION">
    <intent-filter>
        <action android:name="com.yourapp.ACTION" />
    </intent-filter>
</receiver>
...
于 2012-03-02T09:40:09.293 回答
0

这是我的代码:

发件人应用

MainActivity.java

package com.karthik.apptx;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.os.Process;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void OnClickButton(View view) {
        Intent intent = new Intent();
        intent.setAction("com.karthik.apprx");
        intent.putExtra("PACKAGE_NAME", this.getPackageName());
        intent.putExtra("PID", Process.myPid());
        intent.putExtra("DATA", "Hello Karthik");
        intent.setComponent(new ComponentName("com.karthik.apprx", "com.karthik.apprx.AppRxReceiver"));
        sendBroadcast(intent);
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.karthik.apptx">

    <uses-permission android:name="com.karthik.PERMISSION"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppTx">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

接收器应用程序(用 Kotlin 编写)

MyBroadcastReceiver.kt

package com.karthik.apprx

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
import android.widget.Toast

class AppRxReceiver : BroadcastReceiver() {

    override fun onReceive(ctx: Context?, intent: Intent?) {
        Log.d("AppRxReceiver", intent.toString())
        Log.d("AppRxReceiver", intent?.getStringExtra("PACKAGE_NAME").toString())
        Log.d("AppRxReceiver", "" + intent?.getIntExtra("PID", 0))
        Log.d("AppRxReceiver", intent?.getStringExtra("DATA").toString())
        Toast.makeText(ctx, "Received Data", Toast.LENGTH_SHORT).show()
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.karthik.apprx">

    <permission
        android:name="com.karthik.PERMISSION"
        android:protectionLevel="signature"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppRx">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:label="@string/app_name"
            android:theme="@style/Theme.AppRx.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver
            android:name=".AppRxReceiver"
            android:enabled="true"
            android:exported="true"
            android:permission="com.karthik.PERMISSION">
            <intent-filter>
                <action android:name="com.karthik.apptx" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

PS:为方便起见,我选择了用 Java 编写 Sender-App 和 Kotlin 编写 Receiver-App。

于 2022-02-09T10:17:45.250 回答