自从KitKat发布以来,我注意到我的一大堆应用更新了“修复Kit Kat的崩溃”。最近,当我发布自己的应用程序时,我发现可能的来源是使用首选项活动的新“isValidFragment”要求。然而,我无法让任何人解释为什么突然需要这个新类来验证片段。任何人都可以向我解释为什么需要这样做吗?
答案 0 :(得分:11)
子类应覆盖此方法并验证给定片段是否要附加到此活动的有效类型。对于为Android构建的应用程序,默认实现返回true:比KITKAT更早的targetSdkVersion。对于更高版本,它将引发异常。
Android框架中的新漏洞:碎片注入
我们最近披露了Android安全漏洞的新漏洞 球队。该漏洞影响了许多应用,包括设置( 每个Android设备上都有一个,Gmail,Google Now,DropBox 和Evernote。为了更准确,任何扩展的应用程序 使用导出活动的PreferenceActivity类是自动的 脆弱。 Android KitKat中提供了一个补丁。如果你 想知道为什么你的代码现在坏了,这是由于Android KitKat 需要应用程序覆盖新方法的补丁, PreferenceActivity.isValidFragment,已添加到 Android Framework。
http://securityintelligence.com/new-vulnerability-android-framework-fragment-injection/ http://securityintelligence.com/wp-content/uploads/2013/12/android-collapses-into-fragments.pdf
答案 1 :(得分:3)
此处:http://commonsware.com/blog/2013/12/13/sanitize-all-the-extras.html建议将其作为安全修复程序引入:
PreferenceActivity支持额外加载特定 PreferenceFragments into the activity。这被大量使用 设置应用,允许应用直接进入特定屏幕 (实际上是碎片)。 不幸的是,没有逻辑 PreferenceActivity确保只有那些片段 应该是外部可达的是通过这些额外的东西加载 - 因此,添加了isValidFragment()。所以,一个精心设计的 Intent可以打开任何导出的PreferenceActivity并启动任何 在没有这种防御的情况下,PreferenceFragment。
(由我添加的粗体文字)
答案 2 :(得分:1)
取自commonsware的博客。
一旦您将API级别19或更高级别定位,您将需要覆盖PreferenceActivity中的isValidFragment(),以验证提供的片段类名称确实应该显示。脱下袖口,感觉就像处理安全漏洞的一些黑客。
文档说
protected boolean isValidFragment (String fragmentName)
子类应覆盖此方法并验证给定片段是否要附加到此活动的有效类型。对于为Android构建的应用程序,默认实现返回true:比KITKAT更早的targetSdkVersion。对于更高版本,它将引发异常。
答案 3 :(得分:1)
你得到了documented:
子类应覆盖此方法并验证给定的方法 fragment是要附加到此活动的有效类型。默认 对于构建的应用程序,实现返回true android:targetSdkVersion比KITKAT更早。对于以后的版本,它 会抛出异常。
所以只要你的targetSdk低于19,你就不需要关心了。如果是19,则除非您实施isValidFragment()
..