无论 SecurityManager 配置如何,我都可以将我的类编写为 setAccessible-proof 吗?... 还是我任由管理配置的人摆布?
你不能,你肯定是。任何有权访问您的代码的人都可以随意配置他们的 JVM 和 SecurityManager。(下面有更多详细信息)
setAcessible 合法吗?它为什么存在?
Java 核心类使用它作为访问出于安全原因必须保持私有的内容的简单方法。例如,Java 序列化框架在反序列化对象时使用它来调用私有对象构造函数。有人提到 System.setErr,这将是一个很好的例子,但奇怪的是 System 类方法 setOut/setErr/setIn 都使用本机代码来设置 final 字段的值。
另一个明显的合法用途是需要窥探对象内部的框架(持久性、Web 框架、注入)。
最后...
Java 访问修饰符并非旨在成为一种安全机制。
那么我实际上能做些什么呢?
您应该深入了解Java SE 安全文档的安全提供程序部分:
应用程序不需要自己实现安全性。相反,他们可以从 Java 平台请求安全服务。安全服务在提供者中实现
Java 平台中的访问控制架构保护对敏感资源(例如,本地文件)或敏感应用程序代码(例如,类中的方法)的访问。所有访问控制决策都由以java.lang.SecurityManager
类为代表的安全管理器进行调解。必须将 SecurityManager 安装到 Java 运行时中才能激活访问控制检查。
Java 小程序和 Java™ Web Start 应用程序在安装了 SecurityManager 的情况下自动运行。但是,通过该命令执行的本地应用程序java
默认情况下不会在安装了 SecurityManager 的情况下运行。为了使用 SecurityManager 运行本地应用程序,应用程序本身必须通过setSecurityManager
方法(在java.lang.System
类中)以编程方式设置一个,或者必须-Djava.security.manager
在命令行上使用参数调用 java。
我建议您在官方安全文档中进一步阅读
https://docs.oracle.com/javase/7/docs/technotes/guides/security/overview/jsoverview.html