我需要得到用户选择的应用程序的名称与Intent.ACTION_SEND
,以分析的目的。应用程序的名称将通过BroadcastReceiver
获得。
直到有一天,我们团队的安全工程师告诉我们,代码库中的所有PendingIntent
都必须有PendingIntent.FLAG_IMMUTABLE
才是安全的。
添加的标志破坏了现有的功能,因为intent?.getParcelableExtra<ComponentName>(Intent.EXTRA_CHOSEN_COMPONENT)?.packageName
总是返回null。
有什么我能做的吗?遗憾的是,PendingIntent.FLAG_MUTABLE
对我来说不是一个选择。
您可以从Android文档-获取有关共享的信息中找到同样的方法。
MainActivity.kt
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
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
<?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>
发布于 2022-03-11 07:24:15
如果您使用的是明确的意图,那么删除PendingIntent.FLAG_IMMUTABLE
是很好的。
Android应用程序使用意图在组件之间发送消息。意图可以指定目标组件(显式意图)或列出一般操作,并让操作系统将意图传递给设备上注册与该操作匹配的意图筛选器(隐式意图)的任何组件。 PendingIntents是委托给另一个应用程序在未来某个时候交付的意图。创建封装在PendingIntent下的隐式意图是一个安全漏洞,可能导致拒绝服务、私有数据窃取和权限提升。
你可以从隐式PendingIntent漏洞的修复上读到更多关于它的信息。
https://stackoverflow.com/questions/71419951
复制相似问题