如何修复不受保护的SMS BroadcastReceiver lint警告

Gav*_*iel 14 android intentfilter broadcastreceiver android-lint android-permissions

我的应用程序需要能够接收短信.一切正常,但我得到这个lint警告:

声明SMS_DELIVER或SMS_RECEIVED的intent-filter的BroadcastReceivers必须确保调用者具有BROADCAST_SMS权限,否则恶意actor可能会欺骗意图.

如何"确保调用者具有BROADCAST_SMS权限"?

在我的清单中我有:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<application ...>
    <receiver
        android:name=".SmsReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter android:priority="1000">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
</application>
Run Code Online (Sandbox Code Playgroud)

我的代码:

public class SmsReceiver extends BroadcastReceiver {
    public SmsReceiver() {}

    @Override
    public void onReceive(final Context context, final Intent intent) {

        final Bundle bundle = intent.getExtras();
        if (bundle != null) {
            final Object[] pdusObj = (Object[]) bundle.get("pdus");
            for (int i = 0; i < pdusObj.length; i++) {
                final SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                // use currentMessage
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mik*_* M. 25

添加android:permission="android.permission.BROADCAST_SMS"到开始<receiver>标记.

此外,组件默认启用,并<intent-filter>导出它,因此您不需要显式包含这些属性.

<receiver
    android:name=".SmsReceiver"
    android:permission="android.permission.BROADCAST_SMS">
Run Code Online (Sandbox Code Playgroud)

  • @UnKnown` <receiver>`上的`permission`属性指定广播的_sender_必须拥有哪个权限才能使它能够广播到你的`<receiver>`.这是一项安全措施; 在这种情况下,您可以相对确定系统是谁发送`SMS_RECEIVED`广播.这不是严格要求,但如果它不存在,棉绒会抱怨. (4认同)
  • 为什么需要这个权限? (2认同)