可以通过禁止import语句和java。*字符串来阻止访问标准java库吗?

时间:2012-04-09 16:44:56

标签: java code-analysis static-code-analysis

假设我想允许人们在我的服务器上运行简单的控制台java程序,但无法通过我自己的高度限制的API访问文件系统,网络或其他IO。但是,我不想深入了解操作系统级别的限制,所以为了当前的讨论,我想考虑代码级别的清理方法。

因此,假设我尝试按如下方式实现此限制。我将禁止所有“导入”语句,除了那些明确列入白名单的语句(让我们说“import SanitizedSystemIO。”是允许的,而“import java.io。”则不允许)我将禁止字符串“java。 *“代码中的任何地方。因此,用户可以通过这种方式编写从SanitizedSystemIO引用File类的代码,但是他将无法引用java.io.File。这样用户就被迫使用我的清理包装api,而我自己的框架代码(它将与用户的代码一起编译和运行,例如为了提供IO功能)可以访问所有常规的java apis。

这种方法有效吗?或者有没有办法破解它以获得对标准java api的访问?

ETA:好的,首先,它当然应该是java。*字符串而不是系统。*。我认为在C#中,基本上......

其次,好吧,所以人们说,“使用安全管理器”或“使用类加载器”的方法。但是代码分析方法有什么问题呢?我想到的一个好处是简单的KISS简单 - 而不是在SecurityManager中找出要检查和消毒的所有内容,我们只需要一个小的白名单功能并阻止其他所有内容。实施方面,这对于对java知之甚少的人来说是一项微不足道的练习。

并重申我原来的问题,这可能会遭到黑客攻击吗?是否有一些java语言结构允许访问底层api尽管有这样的代码限制?

3 个答案:

答案 0 :(得分:4)

在你的鞋子里,我宁愿在自定义ClassLoader内运行加载的应用程序。

也许我错了,但如果他想通过自己的功能允许对IO的有限访问,那么SecurityManager也不会阻止这些吗?使用自定义ClassLoader,他可以提供他的SanitizedSystemIO,同时拒绝加载他不希望用户加载的内容。

但是,检查代码中的字符串肯定是不是的方法。

答案 1 :(得分:2)

您需要查看SecurityManager。许多JVM类在执行工作之前,如果他们具有所需的权限,则会调用它。

答案 2 :(得分:2)

您可以实施自己的SecurityManagerTutorial