问题列表 - 第37028页

Java安全性:通过URLClassLoader加载的沙盒插件

问题摘要:如何修改下面的代码,以便在安全沙箱中运行不受信任,动态加载的代码,而应用程序的其余部分仍然不受限制?为什么URLClassLoader不像它说的那样处理它?

编辑:更新以回应Ani B.

编辑2:添加了更新的PluginSecurityManager.

我的应用程序有一个插件机制,第三方可以提供包含实现特定接口的类的JAR.使用URLClassLoader,我能够加载该类并实例化它,没问题.因为代码可能不受信任,我需要防止它行为不端.例如,我在一个单独的线程中运行插件代码,这样如果它进入无限循环或者只是花费太长时间我就可以杀死它.但是尝试为他们设置一个安全沙箱,以便他们无法做出像网络连接或访问硬盘驱动器上的文件这样的事情让我感到非常沮丧.我的努力总是导致对插件没有影响(它具有与应用程序相同的权限)或者也限制了应用程序.我希望主应用程序代码能够完成它想要的任何东西,

关于这一主题的文献和在线资源是复杂,混乱和矛盾的.我已经阅读过各种各样的地方(例如这个问题),我需要提供一个自定义的SecurityManager,但是当我尝试它时,我遇到了问题,因为JVM延迟加载JAR中的类.所以我可以很好地实例化它,但是如果我在加载的对象上调用一个方法来实例化来自同一个JAR的另一个类,那么它就会爆炸,因为它被拒绝了从JAR读取的权利.

从理论上讲,我可以在SecurityManager中检查FilePermission,看看它是否正在尝试加载自己的JAR.这没关系,但URLClassLoader文档说:"默认情况下,加载的类只被授予访问创建URLClassLoader时指定的URL的权限." 那为什么我甚至需要一个自定义的SecurityManager?URLClassLoader不应该只处理这个吗?为什么不呢?

这是一个重现问题的简化示例:

主要应用(可信)

PluginTest.java

package test.app;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

import test.api.Plugin;

public class PluginTest {
    public static void pluginTest(String pathToJar) {
        try {
            File file = new File(pathToJar);
            URL url = file.toURI().toURL();
            URLClassLoader cl = new URLClassLoader(new java.net.URL[] { url });
            Class<?> clazz = cl.loadClass("test.plugin.MyPlugin");
            final Plugin plugin = (Plugin) clazz.newInstance();
            PluginThread thread = new PluginThread(new Runnable() {
                @Override
                public void run() {
                    plugin.go();
                }
            }); …
Run Code Online (Sandbox Code Playgroud)

java classloader securitymanager urlclassloader

33
推荐指数
3
解决办法
7770
查看次数

Google Guava比Apache Collections"更难"使用吗?

我想让我的团队使用混合技能级别来使用Google Guava.在Guava之前,我已经使用了Apache Collections(或其通用版本).

与Apache Collections相反,Guava在某些方面似乎更强大,但对于经验不足的程序员来说可能不太容易使用.这是我认为可以举例说明的一个领域.

我继承的代码包含很多循环,这些循环基本上是异构值的映射,探测它们的值,进行空检查,然后做一些微不足道的事情:

boolean foo( final List< MapLike > stuff, final String target ) {
  final String upperCaseTarget = target.toUpperCase(0;

  for( MapLike m : stuff ) {
     final Maplike n = (MapLike) m.get( "hard coded string" );
     if( n != null ) {
         final String s = n.get( "another hard code string" );
         if( s != null && s.toUpperCase().equals( upperCaseTarget ) ) {
            return true ;
         }
     }
   return false ;
}
Run Code Online (Sandbox Code Playgroud)

我最初的想法是使用Apache Collections Transformers:

boolean foo( …
Run Code Online (Sandbox Code Playgroud)

java collections guava

26
推荐指数
2
解决办法
5867
查看次数

如何限制Java中的带宽?

我写了一个Java调度程序,每小时使用:

new SAXBuilder().build(new URL(xxx));
Run Code Online (Sandbox Code Playgroud)

要么

HttpConnection.connect(new URL(xxx)); // jsoup library code
Run Code Online (Sandbox Code Playgroud)

获取一个大的XML/HTML文件.

我的服务器最大带宽限制是2Mbits.

当这个Java调度代码运行时,我使用超过2Mbits的带宽.(看看)

因此,每次用户访问我的服务器时,它都太慢了.

如何限制Java计划使用较低的带宽?(例如500Kbits)

我正在使用Ubuntu服务器.

java

9
推荐指数
2
解决办法
2万
查看次数

Android相当于NSNotificationCenter

在将iPhone应用程序移植到android的过程中,我正在寻找在应用程序内进行通信的最佳方式.意图似乎是要走的路,这是最好的(唯一的)选择吗?NSUserDefaults在性能和编码方面的重量似乎比Intents轻得多.

我还应该添加我有一个状态的应用程序子类,但我需要让另一个活动知道一个事件.

iphone events android nsnotificationcenter ios

92
推荐指数
4
解决办法
2万
查看次数

有关Google App Engine的缓存代理的详细信息?

Google App Engine必须具有某种反向缓存代理,因为当我Cache-Control public, max-age=300从其中一个servlet 设置响应头时,对应用引擎的后续请求会显示在日志中,如下所示: /testcaching 204 1ms 0cpu_ms 49kb而非缓存请求在日志中显示为:/testcaching 200 61ms 77cpu_ms 49kb.

无论如何,我的问题是:有没有人有关于这个反向缓存代理的更多细节?

google-app-engine caching

18
推荐指数
2
解决办法
3283
查看次数

在类中使用C++ 0x TR1随机,以降低开销

我正在使用VC 2010并试图通过将随机定义放在每个类实例的构造函数中来保持某些函数的开销和重复代码,然后根据需要从那里调用.我现在简化的是:

#include <random>
#include <Windows.h>
mt19937 eng(GetTickCount());

class Cycles {
    int line;
    normal_distribution<> rand_norm;
    variate_generator<mt19937&,normal_distribution<>> r_norm;
public:
    Cycles() 
    : rand_norm(0.85,0.05),
      r_norm(eng,rand_norm) { 
        line=0; 
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,我最终得到了这个错误:

\ vc\include\random(513):错误C2248:'std :: tr1 :: _ Ewrap <_Engine,_Tgt_type> :: operator =':无法访问类'std :: tr1 :: _ Ewrap <_Engine中声明的私有成员, _Tgt_type>"

\ vc\include\random(446):查看'std :: tr1 :: _ Ewrap <_Engine,_Tgt_type> :: operator ='的声明

此诊断发生在编译器生成的函数'std :: tr1 :: variate_generator <_Engine,_Distrib>&std :: tr1 :: variate_generator <_Engine,_Distrib> :: operator =(const std :: tr1 :: variate_generator <_Engine,_Distrib >&)'

我理解这些应该在构造函数打开之前初始化,否则由于缺少默认构造函数而导致错误,但我不明白为什么会失败.我的C++ fu很生疏.

我看到的每个例子都显示分布器和生成器在调用它的函数中全局或本地初始化,这对我来说似乎很愚蠢,因为我有几个成员函数将使用在紧密循环中调用的r_norm.它严重失败了气味测试.没有人知道我错过了什么吗?

c++ random class tr1

4
推荐指数
1
解决办法
1804
查看次数

Python - 从列表中删除项目

# I have 3 lists:
L1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
L2 = [4, 7, 8]
L3 = [5, 2, 9]
# I want to create another that is L1 minus L2's memebers and L3's memebers, so:
L4 = (L1 - L2) - L3  # Of course this isn't going to work
Run Code Online (Sandbox Code Playgroud)

我想知道,做到这一点的"正确"方法是什么.我可以用很多不同的方式来做,但Python的风格指南说应该只有一种正确的方法来做每件事.我从来不知道这是什么.

python list-comprehension

9
推荐指数
2
解决办法
2953
查看次数

游戏"极品飞车的极品飞车"无法通过Java类机器人控制

我用Java Robot编写了一个用于控制赛车游戏的机器人.除了键"向下"(向上,向左,向右键工作得非常好)之外,机器人适用于极品飞车地下.但是我的机器人无法控制极品飞车最需要的速度.

机器人工作正常,但游戏不接受模拟的关键事件.我做了一些搜索,发现游戏是基于DirectX的.在DirectX中,键盘/鼠标事件是特殊的.似乎游戏直接"询问"键盘,而不是通过Windows.我在CS中尝试我的程序,发现它运行得很好.

我使用Eclipse和Java 1.6在Windows 7中编程.所以我想问为什么不需要速度最想要接受模拟的关键事件以及如何解决这个程序?谢谢.

java

6
推荐指数
1
解决办法
2844
查看次数

如何使用linq重写这个foreach循环?

假设我有两个类,Customer和Order,其中一个Customer可以有一个或多个Orders Orders.

class Customer
{
  Order[] Orders;
}

class Order
{
  int OrderId;
}
Run Code Online (Sandbox Code Playgroud)

如果对于任何给定的客户,我想找到所有相关的OrderId,是否有一种简单的方法可以使用linq做到这一点?与以下foreach解决方案产生相同结果的东西:

List<int> allOrderIds = new List<int>();
foreach (Order thisOrder in thisCustomer)
{
   allOrderIds.Add(thisOrder.OrderId);
}
Run Code Online (Sandbox Code Playgroud)

TIA.

c# linq foreach

0
推荐指数
1
解决办法
1365
查看次数

在Java中,如何根据方法的情况返回String或double?可能吗?

例如,我有一个方法,通过字符串查找由指定的分隔符分隔的数据,但有些项可能是名称,其他项可能是数字.

如果用户调用我的方法从已删除列表中返回项目编号X,我希望它在项目X是名称时返回字符串,或者如果项目X是数字则返回双精度.

例如,objectName.get(5);将获得已删除列表中的第5项.

我是否必须使用某种类型的重载?

或者我是否必须做一些类似的事情objectName.getDouble(5);objectName.getString(5);基于用户知道项目5是什么的事实?

但是如果用户不知道项目5是什么呢?他只需要一个String或一个Double,取决于它碰巧是什么.

java methods overloading return-type return-value

3
推荐指数
2
解决办法
4万
查看次数