12

Moja aplikacja musi być w stanie odbierać wiadomości SMS. To wszystko działa, ale pojawia się to ostrzeżenie niestrzępiącą:Jak naprawić niezabezpieczony SMS BroadcastReceiver lint warning

BroadcastReceivers że zadeklarować intent-filtr dla SMS_DELIVER lub SMS_RECEIVED musi zapewnić, że rozmówca ma BROADCAST_SMS zgody, w przeciwnym razie możliwe jest złośliwe aktorzy sfałszować zamiary.

Jak "upewnić się, że abonent wywołujący ma uprawnienie BROADCAST_SMS"?

W moim manifeście mam:

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

Mój kod:

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

Odpowiedz

20

Dodaj android:permission="android.permission.BROADCAST_SMS" do otwarcia <receiver> tagu.

Ponadto komponenty są domyślnie włączone, a <intent-filter> eksportuje je, więc nie trzeba ich wyraźnie włączać.

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

Dlaczego potrzebne to uprawnienie? – UnKnown

+1

@UnKnown Atrybut 'permission' na' 'określa, jakie uprawnienia musi posiadać _sender_ programu broadcast, aby mógł nadawać do twojego' '. To środek bezpieczeństwa; w tym przypadku, możesz więc być względnie pewny, że to system wysyła transmisję "SMS_RECEIVED". Nie jest to bezwzględnie wymagane, ale lint będzie narzekać, jeśli go nie ma. –

0

Mój kod:

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