如果我们有一个由其他组件调用的Android活动X.我们希望确保只进行合法的通话。是否可以使调用组件使用Activity.startActivityForResult()方法启动我们的活动,这将允许X根据预定义的白名单检查调用者?作为documented,标准的startActivity()方法不会通知被叫活动有关调用者的身份。
startActivityForResult方法的文档说明:
请注意,此方法只应与Intent协议一起使用 被定义为返回结果
如果来电者只是忽略了结果,那么损害会是什么?
当然,这应该是在获得X许可的情况下作为额外的安全措施。
为什么?
定义权限是此经典问题的技术解决方案 - 限制对公开组件的访问。但是,潜在的恶意应用程序可能只是请求此权限,并希望用户在安装过程中不注意。后者可以而且将会发生,或者至少没有技术手段可以阻止它。
可以定义签名级别权限,以解决问题。这仍然限制了使用相同的密钥对所有呼叫者进行签名,但这并不总是可行的。
另一种方法是使用签名/加密的附加功能并检查签名。然而,我们得到的问题是如何存储和保护用于此的密钥。私钥/秘密密钥必须在应用程序中,并且必须保持不变,这意味着它最终可能被盗。钥匙串存储提供了一些保护,应用程序仍然可以请求密钥访问,由用户决定是否授予密钥。
谢谢
瓦西
P.S。 我知道我正在努力为“粗心用户”问题寻找技术解决方案,这通常很难。
答案 0 :(得分:1)
对我而言,您似乎只想检查您的活动是否可以由其他应用程序运行。我还假设你确实希望某些应用程序运行你的Activity,并且调用活动不会有结果。
如果由我决定,我只需要调用activity来调用startActivityForResult,从而在Intent中包含包和活动信息。然后我可以在我的Activity的onCreate方法中使用相应的getter函数获取这些并将它们与白名单进行比较,然后选择是否在那里完成我的活动。如果调用者只使用startActivity,那么这些字段无论如何都将为null并且检查失败。
不确定这是否是最优雅的方式,但对我来说似乎最简单。
答案 1 :(得分:-1)
实现此目的的一种方法是让调用活动以预定值传递到用于启动它的intent中。然后,调用活动可以将该值放入用于启动活动的意图中。然后在您的活动中,您可以调用getIntent()
并检查以确保在执行任何操作之前预定值已存在。