草庐IT

android - 防止反射 - android

coder 2023-11-29 原文

即使是我的类的私有(private)成员/函数也可以使用 setAccessible(true) 通过反射访问。有没有办法阻止这种来自外部代码的访问?

我在 stack-overflow 上读到一些东西,我可以使用 SecurityManager 来防止小程序中的反射(虽然不确定它是如何工作的),但是 Android 是否有类似的机制出色地?也许是注释或巧妙的编程?

最佳答案

退后一步,您观察到的是 Sun 最初体现在 JVM 中的 Java 执行模型与 Android 的执行模型在安全理念上的差异。

最初的 Java VM 设计旨在用于一个系统,其中多个相互可疑的应用程序(或 Java 术语中的“小程序”)将同时驻留在单个地址空间中,在单个 VM 中运行。因为设计者不希望一个应用程序能够干扰另一个应用程序,所以他们煞费苦心地定义了一个 VM 内部安全模型,该模型将不允许诸如一个对象接触不同类的另一个对象的私有(private)字段之类的事情。

也就是说,Java 库最终在安全模型之外有各种“逃生 channel ”。正如您所注意到的,其中之一是反射对象上的 setAccessible()

Android 的模型不同:Android 使用进程作为安全边界和应用程序隔离单元,而不是像传统 JVM 那样试图将其融入进程。这使整个 Java 安全模型变得毫无意义,除了因为它帮助应用程序“将其从自身中拯救出来”。也就是说,不让一个对象侵入另一个对象的私有(private)部分是一个很好的设计,而默认的 Java 安全模型恰恰提供了这一点。

撇开人们修改您的代码的问题不谈,对于 Android,作为应用程序的作者,您可以控制最终在您的应用程序进程中运行的所有代码。如果您选择包含调用 setAccessible() 的代码,那是您的事。您可能会搬起石头砸自己的脚,但您肯定不会搬起石头砸自己的脚,因为 Android 安全模型在进程层运行,本质上不会让这种情况发生。同样,使用 native 代码将使您完全脱离 Java 对象模型,这允许事情在过程中变得完全杂乱无章,但也允许您以比在 Java 中更有效的方式表达一些事情。这是一种权衡,但这是针对每个应用程序开发人员的权衡,不会特别影响您手机/设备上发生的任何其他事情。

我知道这并不能直接回答您的问题,但我希望它提供了一些有用的背景信息。

关于android - 防止反射 - android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13211369/

有关android - 防止反射 - android的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby-on-rails - Rails 3.2 防止使用错误保存对象 - 2

    我有一个ActiveRecord对象,我想在不对模型进行永久验证的情况下阻止它被保存。您过去可以使用errors.add执行类似的操作,但它看起来不再有效了。user=User.lastuser.errors.add:name,"namedoesn'trhymewithorange"user.valid?#=>trueuser.save#=>true或user=User.lastuser.errors.add:base,"myuniqueerror"user.valid?#=>trueuser.save#=>true如何在不修改用户对象模型的情况下防止将用户对象保存在Rails3.2中

  3. ruby - 防止SQL注入(inject)/好的Ruby方法 - 2

    Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject

  4. ruby-on-rails - 如何防止错误 "code converter not found (UTF-8)"? - 2

    我在生产环境(CentOS5.6)中遇到此错误,但在开发环境(Ubuntu11.04)中运行良好。在这两种环境中,该应用程序都使用Ruby1.9.3和Rails3.0.9,并由passenger和nginx提供服务。我的Mechanizegem版本是2.3。未找到代码转换器(UTF-8)此代码的最后一行触发它:mech=Mechanize.newpage=mech.get("http://myurl.com/login.php?login_name=a&password=b")form=page.form_with(:name=>"loginForm")form.field_with(

  5. ruby-on-rails - 使用模型属性调用的 Brakeman 不安全反射方法常量化 - 2

    在我的Rails应用程序中,我收到来自brakeman的以下安全警告。使用模型属性调用的不安全反射方法常量化。这是我的代码正在执行的操作。chart_type=Chart.where(id:chart_id,).pluck(:type).firstbeginChartPresenter.new(chart_type.camelize.constantize.find(chart_id))rescueraise"Unabletofindthechartpresenter"end根据我的研究,我还没有找到任何具体的解决方案。我听说你可以创建一个白名单,但我不确定brakeman在寻找什么。

  6. ruby-on-rails - 防止为每个评论调用 upvote 模型 - 2

    我有三个模型:User、Comment和Upvote。User-to-Comment是一对多的关系,Comment-to-Upvote是一对多的关系,而User-to-Upvote是一对多的关系。我想做一些类似于在Stackoverflow上进行投票的事情。因此,当您投赞成票/反对票时,箭头将突出显示并保持突出显示状态,即使您在几天/几周后刷新页面或返回页面也是如此。目前我正在这样做:voted?方法在哪里:defself.voted?(user_id,comment_id)find_by(comment_id:comment_id,user_id:user_id).present?e

  7. ruby - ruby 的反射? - 2

    我很好奇这是如何工作的。例如,如果我创建一个基于工厂模式的类,您可以在其中“注册”类供以后使用,然后执行类似FactoryClass.register('YourClassName',[param,param,...]);FactoryClass.create('your_class_name').call_method_from_this_object其中'class_name'是映射到值的散列中的键:ClassName有没有类似phpreflection的东西,我可以在哪里创建基于字符串名称的类的实例并传入参数?(在php中,参数将是它们的数组,php然后知道如何处理)所以如果我们

  8. ruby - 防止 ruby​​ sinatra 中的 session 固定 - 2

    ruby中的大多数session固定主题都与Rails相关。sinatra中是否存在任何session固定漏洞?在rails中,我们通常建议在分配session之前执行reset_session。我们如何防止sinatra中的session固定? 最佳答案 Sinatra默认使用Rack::Protectiongem来防止许多常见漏洞。您可能对其session劫持保护特别感兴趣。这些是Rack::Protectiongem防止的一些事情:跨站请求伪造真实性token:如果给定的访问token与session中包含的token相匹配,

  9. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  10. Android 10.0 设置默认launcher后安装另外launcher后默认Launcher失效的功能修复 - 2

    1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La

随机推荐