12

Meine App muss SMS empfangen können. Es funktioniert alles, aber ich habe diese Flusen Warnung:So beheben Sie ungeschützte SMS BroadcastReceiver Flusenwarnung

BroadcastReceivers, die eine Intent-Filter für SMS_DELIVER oder SMS_RECEIVED erklären müssen sicherstellen, dass der Anrufer die BROADCAST_SMS Erlaubnis hat, sonst ist es möglich, für böswillige Akteure zu fälschen Absichten.

Wie kann ich sicherstellen, dass der Anrufer über die Berechtigung BROADCAST_SMS verfügt?

In meinem Manifest habe ich:

<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> 

Mein Code:

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 
      } 
     } 
    } 
} 

Antwort

20

hinzufügen android:permission="android.permission.BROADCAST_SMS" zur Öffnung <receiver> Tag.

Außerdem sind Komponenten standardmäßig aktiviert, und die <intent-filter> exportiert es, so dass Sie diese Attribute nicht wirklich explizit angeben müssen.

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

Warum diese Berechtigung erforderlich? – UnKnown

+1

@UnKnown Das Attribut 'permission' auf einem' 'gibt an, welche Berechtigung der _sender_ der Broadcast haben muss, damit er in der Lage ist, an Ihre' ' zu senden. Es ist eine Sicherheitsmaßnahme; In diesem Fall können Sie relativ sicher sein, dass das System die Sendung "SMS_RECEIVED" sendet. Es ist nicht unbedingt erforderlich, aber Lint wird sich beschweren, wenn es nicht da ist. –

0

Mein Code:

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 
     } 
    } 
} 
} 
Verwandte Themen