为什么Kit Kat需要使用isValidFragment?

时间:2014-01-01 12:27:49

标签: android android-fragments preferenceactivity

自从KitKat发布以来,我注意到我的一大堆应用更新了“修复Kit Kat的崩溃”。最近,当我发布自己的应用程序时,我发现可能的来源是使用首选项活动的新“isValidFragment”要求。然而,我无法让任何人解释为什么突然需要这个新类来验证片段。任何人都可以向我解释为什么需要这样做吗?

4 个答案:

答案 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() ..

,否则您的应用会因异常而崩溃