首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法使用PendingIntent.FLAG_IMMUTABLE获取选择的第三方应用程序的包名

无法使用PendingIntent.FLAG_IMMUTABLE获取选择的第三方应用程序的包名
EN

Stack Overflow用户
提问于 2022-03-10 06:56:08
回答 1查看 366关注 0票数 1

我需要得到用户选择的应用程序的名称与Intent.ACTION_SEND,以分析的目的。应用程序的名称将通过BroadcastReceiver获得。

直到有一天,我们团队的安全工程师告诉我们,代码库中的所有PendingIntent都必须有PendingIntent.FLAG_IMMUTABLE才是安全的。

添加的标志破坏了现有的功能,因为intent?.getParcelableExtra<ComponentName>(Intent.EXTRA_CHOSEN_COMPONENT)?.packageName总是返回null。

有什么我能做的吗?遗憾的是,PendingIntent.FLAG_MUTABLE对我来说不是一个选择。

您可以从Android文档-获取有关共享的信息中找到同样的方法。

MainActivity.kt

代码语言:javascript
运行
复制
const val PENDING_INTENT_REQUEST_CODE = 0x1000
const val THIRD_PARTY_SHARE_REQUEST_CODE = 0x1001
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        btnShare.setOnClickListener {
            openThirdPartyShareDialog()
        }
    }

    private fun openThirdPartyShareDialog() {
        val thirdPartyShareIntent = Intent().apply {
            action = Intent.ACTION_SEND
            type = "text/plain"
        }

        val broadcastIntent = Intent(this, ThirdPartyAppBroadcastReceiver::class.java)

        val pendingIntent = PendingIntent.getBroadcast(this,
            PENDING_INTENT_REQUEST_CODE,
            broadcastIntent,
            getPendingFlagIntent()
        )

        startActivityForResult(Intent.createChooser(
            thirdPartyShareIntent,
            null,
            pendingIntent.intentSender
        ), THIRD_PARTY_SHARE_REQUEST_CODE)
    }

    private fun getPendingFlagIntent(): Int {
        var flags = PendingIntent.FLAG_UPDATE_CURRENT
        if (Build.VERSION.SDK_INT >= 23) {
            flags = flags or PendingIntent.FLAG_IMMUTABLE
        }
        return flags
    }
}

ThirdPartyAppBroadcastReceiver.kt

代码语言:javascript
运行
复制
class ThirdPartyAppBroadcastReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
    // packageName will always be null !
        val packageName =
            intent?.getParcelableExtra<ComponentName>(Intent.EXTRA_CHOSEN_COMPONENT)?.packageName 
    }
}

AndroidManifest.xml

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.flamyoad.broadcast_share"
    >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Broadcastshare"
        >
        <receiver android:name="com.flamyoad.broadcast_share.ThirdPartyAppBroadcastReceiver" />
        <activity
            android:name=".MainActivity"
            android:exported="true"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
EN

回答 1

Stack Overflow用户

发布于 2022-03-11 07:24:15

如果您使用的是明确的意图,那么删除PendingIntent.FLAG_IMMUTABLE是很好的。

Android应用程序使用意图在组件之间发送消息。意图可以指定目标组件(显式意图)或列出一般操作,并让操作系统将意图传递给设备上注册与该操作匹配的意图筛选器(隐式意图)的任何组件。 PendingIntents是委托给另一个应用程序在未来某个时候交付的意图。创建封装在PendingIntent下的隐式意图是一个安全漏洞,可能导致拒绝服务、私有数据窃取和权限提升。

你可以从隐式PendingIntent漏洞的修复上读到更多关于它的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71419951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档