12

Ứng dụng của tôi cần có thể nhận tin nhắn SMS. Tất cả các công trình, nhưng tôi nhận được cảnh báo lint này:Cách khắc phục cảnh báo lint SMS BroadcastReceiver không được bảo vệ

BroadcastReceivers rằng tuyên bố một ý định lọc cho SMS_DELIVER hoặc SMS_RECEIVED phải đảm bảo rằng người gọi có BROADCAST_SMS phép, nếu không nó có thể cho các diễn viên độc hại giả mạo ý định.

Làm cách nào để "đảm bảo người gọi có quyền BROADCAST_SMS"?

Trong manifest của tôi, tôi có:

<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ã của tôi:

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

Trả lời

20

Thêm android:permission="android.permission.BROADCAST_SMS" đến việc mở <receiver> thẻ.

Ngoài ra, các thành phần được bật theo mặc định và xuất khẩu <intent-filter>, vì vậy bạn không thực sự cần bao gồm rõ ràng các thuộc tính đó.

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

Tại sao sự cho phép này yêu cầu? – UnKnown

+1

@UnKnown Thuộc tính 'permission' trên' 'chỉ định quyền nào _sender_ của chương trình phát sóng phải giữ để nó có thể phát sóng tới' 'của bạn. Đó là một biện pháp an ninh; trong trường hợp này, vì vậy bạn có thể tương đối chắc chắn rằng hệ thống là ai đang gửi phát 'SMS_RECEIVED'. Nó không phải là bắt buộc, nhưng lint sẽ khiếu nại nếu nó không có ở đó. –

0

Mã của tôi:

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 
     } 
    } 
} 
} 
Các vấn đề liên quan