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

Posted

技术标签:

【中文标题】如何修复未受保护的 SMS BroadcastReceiver lint 警告【英文标题】:How to fix Unprotected SMS BroadcastReceiver lint warning 【发布时间】:2016-07-07 18:03:06 【问题描述】:

我的应用需要能够接收 SMS 消息。一切正常,但我收到此 lint 警告:

为 SMS_DELIVER 或声明意图过滤器的广播接收器 SMS_RECEIVED 必须确保调用者有 BROADCAST_SMS 许可,否则恶意行为者有可能进行欺骗 意图。

如何“确保来电者有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>

我的代码:

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
            
        
    

【问题讨论】:

【参考方案1】:

android:permission="android.permission.BROADCAST_SMS" 添加到开头的&lt;receiver&gt; 标记。

此外,组件默认启用,&lt;intent-filter&gt; 将其导出,因此您实际上不需要显式包含这些属性。

<receiver
    android:name=".SmsReceiver"
    android:permission="android.permission.BROADCAST_SMS">

【讨论】:

为什么需要这个权限? @UnKnown &lt;receiver&gt; 上的permission 属性指定广播的发送者 必须拥有哪个权限才能广播到您的@987654327 @。这是一种安全措施;在这种情况下,您可以相对确定系统是谁在发送SMS_RECEIVED 广播。它不是严格要求的,但如果它不存在,lint 会抱怨。

以上是关于如何修复未受保护的 SMS BroadcastReceiver lint 警告的主要内容,如果未能解决你的问题,请参考以下文章

SSH 密钥未受保护的 terraform ansible jenkins

EC2 Ubuntu 实例 - 未受保护的私钥文件

OpenSSH Windows - AWS“eb ssh”导致“警告:未受保护的密钥文件!”

854GB!未受保护的MongoDB泄露2.02亿中国求职者简历

如何在 Firebase 电话身份验证中修复 SMS 权限?清单中没有提到要删除的权限

如何在 Excel 2013 中对受保护的工作表启用排序