修复Xamarin Android中的碎片注入漏洞

修复Xamarin Android中的碎片注入漏洞,android,security,xamarin.android,Android,Security,Xamarin.android,正如您所知,Android开发者: 从2017年3月1日开始,Google Play将阻止发布任何新的应用程序或更新,其中PreferenceActivity类可能容易受到碎片注入的攻击 在该页面中,它提供了一些关于如何修复此漏洞的建议,但是使用Xamarin开发的应用程序呢? 我还没找到这方面的任何信息。它说我受影响的类是SettingActivity,它继承自PreferenceActivity,我的类SettingActivity是这样的: [Activity( Label =

正如您所知,Android开发者:

从2017年3月1日开始,Google Play将阻止发布任何新的应用程序或更新,其中PreferenceActivity类可能容易受到碎片注入的攻击

在该页面中,它提供了一些关于如何修复此漏洞的建议,但是使用Xamarin开发的应用程序呢?

我还没找到这方面的任何信息。它说我受影响的类是SettingActivity,它继承自PreferenceActivity,我的类SettingActivity是这样的:

 [Activity(
    Label = "@string/ApplicationName",
    Icon = "@drawable/ic_launcher",
    Theme = "@android:style/Theme.Holo.Light",
    ParentActivity = typeof(MainActivity))]
[IntentFilter(
    new [] {Intent.ActionManageNetworkUsage},
    Categories= new [] {Intent.CategoryDefault}
)]
public class SettingsActivity : PreferenceActivity
{
    public static readonly string KeyWifiOnly = "pref_wifi_only";

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        AddPreferencesFromResource(Resource.Xml.preferences);

        ActionBar.SetHomeButtonEnabled(true);
        ActionBar.SetDisplayHomeAsUpEnabled(true);

        PreferenceManager.SetDefaultValues(this, Resource.Xml.preferences, false);

        SetupNetworkPreferences();
    }

    private void SetupNetworkPreferences()
    {
        var prefs = PreferenceManager.GetDefaultSharedPreferences(this);

        ListPreference list = FindPreference(
            AppSettings.PreferenceNetworkProvider) as ListPreference;

        list.SetEntries(
            Enum.GetNames(typeof(AppSettings.FtpHostNetwork)));

        list.SetEntryValues(Enum
            .GetValues(typeof(AppSettings.FtpHostNetwork))
            .Cast<int>()
            .Select(x => x.ToString())
            .ToArray());
    }

    protected override void OnResume()
    {
        base.OnResume();

        var tracker = (Application as App).Tracker;
        tracker.Screen("PantallaPreferencias");
    }
}
[活动](
Label=“@string/ApplicationName”,
Icon=“@drawable/ic_启动器”,
Theme=“@android:style/Theme.Holo.Light”,
ParentActivity=typeof(MainActivity))]
[意图过滤器(
新[]{Intent.ActionManageNetworkUsage},
Categories=new[]{Intent.CategoryDefault}
)]
公共类设置活动:首选活动
{
公共静态只读字符串KeyWifiOnly=“pref\u wifi\u only”;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
AddPreferencesFromResource(Resource.Xml.preferences);
ActionBar.SetHomeButtonEnabled(真);
ActionBar.SetDisplayHomeAsUpEnabled(true);
SetDefaultValues(this,Resource.Xml.preferences,false);
SetupNetworkPreferences();
}
专用void SetupNetworkPreferences()
{
var prefs=PreferenceManager.GetDefaultSharedPreferences(这个);
ListPreference列表=FindReference(
AppSettings.PreferenceNetworkProvider)作为ListPreference;
list.SetEntries(
Enum.GetNames(typeof(AppSettings.FtpHostNetwork));
list.SetEntryValues(枚举
.GetValues(类型(AppSettings.FtpHostNetwork))
.Cast()
.Select(x=>x.ToString())
.ToArray());
}
受保护的覆盖void OnResume()
{
base.OnResume();
var tracker=(应用程序作为应用程序).tracker;
跟踪屏幕(“PantallaPreferencias”);
}
}

正如Mike Ma在评论中所建议的:

添加导出的=false属性效果很好

[Activity( Label = "@string/ApplicationName", Exported =false, Icon = "@drawable/ic_launcher", Theme = "@android:style/Theme.Holo.Light", ParentActivity = typeof(MainActivity))] 

正如Mike Ma在评论中所建议的:

添加导出的=false属性效果很好

[Activity( Label = "@string/ApplicationName", Exported =false, Icon = "@drawable/ic_launcher", Theme = "@android:style/Theme.Holo.Light", ParentActivity = typeof(MainActivity))] 

尝试将导出设置为false
[Activity(Label=“@string/ApplicationName”,Exported=false,Icon=“@drawable/ic_launcher”,Theme=“@android:style/Theme.Holo.Light”,ParentActivity=typeof(MainActivity))][IntentFilter(new[]{Intent.ActionManageNetworkUsage},Categories=new[]{Intent.CategoryDefault}][/code>是,这就成功了。谢谢你,迈克。您刚刚将我的作业集导出保存为false
[Activity(Label=“@string/ApplicationName”,Exported=false,Icon=“@drawable/ic_launcher”,Theme=“@android:style/Theme.Holo.Light”,ParentActivity=typeof(MainActivity))][IntentFilter(new[]{Intent.ActionManageNetworkUsage},Categories=new[]{Intent.CategoryDefault}
是的,这样做很有效。非常感谢迈克。你刚刚救了我的饭碗