通过反射调用方法会带来哪些安全问题?

时间:2015-08-10 07:44:47

标签: java json

我正在开发一个拥有主机和客户端的项目,主机可以向客户端发送命令(通过套接字)。

我确定使用JSON进行通信效果最佳。

例如:

{
    "method" : "toasty",
    "params" : ["hello world", true]
}

在此示例中,当此JSON字符串发送到客户端时,将对其进行处理,并在客户端中运行合适的方法:

public abstract class ClientProcessor {

    public abstract void toasty(String s, boolean bool);
    public abstract void shutdown(int timer);

    private Method[] methods = getClass().getDeclaredMethods();

    public void process(String data) {
        try {
            JSONObject json = new JSONObject(data);
            String methodName = (String) json.get("method");

            if (methodName.equals("process"))
                return;

            for (int i = 0; i < methods.length; i++)
                if (methods[i].getName().equals(methodName)) {
                    JSONArray arr = json.getJSONArray("params");

                    int length = arr.length();
                    Object[] args = new Object[length];
                    for (int i2 = 0; i2 < length; i2++)
                        args[i2] = arr.get(i2);

                    methods[i].invoke(this, args);
                    return;
                }
        } catch (Exception e) {}
    }
}

使用ClientProcessor:

public class Client extends ClientProcessor {
    @Override
    public void toasty(String s, boolean bool) {
        //make toast here
    }

    @Override
    public void shutdown(int timer) {
        //shutdown system within timer
    }

    public void processJSON(String json) {
        process(json);
    }
}

服务器将JSON发送到客户端,但可以修改服务器以发送不同的JSON。

我的问题是:

  • 这是一种通过处理JSON来运行方法的安全方法吗?
  • 有更好的方法吗?我认为使用反射非常慢。

3 个答案:

答案 0 :(得分:4)

有100种方法可以处理JSON消息,以便进行一些处理,但它们都归结为:

  • 解析消息
  • 将消息映射到方法
  • 调用方法
  • 发送回复

虽然您可以使用反射调用(在性能方面,大多数情况下都可以)调用方法,但是,imho会有点过于开放 - 恶意客户端可能会因为发出{而导致系统崩溃{1}}来电。

反射还会让您不得不正确映射参数,这比您在问题中显示的代码更复杂。

所以不要使用Reflection。

你能做的是定义一个简单的wait,其中的实现将理解如何处理参数并让你的处理器(通常称为控制器)调用它,像这样的东西:

interface

答案 1 :(得分:0)

将方法名称映射到int常量,并在这些常量上切换(case)以调用适当的方法。

M

答案 2 :(得分:-3)

我相信您正在尝试将JSON字符串转换为Java对象,反之亦然......如果这是要求,那么这将不是正确的方法......

尝试任何像Gson这样的开源API ... 它是Google用于将Java转换为JSON的API,反之亦然。

请检查...... https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/Gson.html

如果您有任何其他问题,请告诉我......