最近我在一个通用的 JSR245 portlet 类中发现了一个这样的函数:
public class MyGenericPortlet extends GenericPortlet {
@Override
public void processAction(ActionRequest rq, ActionResponse rs) throws PortletException{
String actParam = rq.getParameter("myAction");
if( (actParam != null) && (!("").equals(actParam))) {
try{
Method m = this.getClass().getMethod(actParam, new Class[]{ActionRequest.class, ActionResponse.class});
m.invoke(this, new Object[]{rq, rs});
}
catch(Exception e){
setRequestAttribute(rq.getPortletSession(),"error", "Error in method:"+action);
e.printStackTrace();
}
}
else setRequestAttribute(rq.getPortletSession(),"error", "Error in method:"+action);
}
}
这样的代码有多安全?据我所知,可能会出现以下问题:
- 从客户端传输的参数未经检查用于调用函数。这允许任何可以将数据传输到相应 portlet 的人调用任何匹配的函数。另一方面,要调用的函数必须具有特定的接口。通常这样的功能非常少见。
- 程序员可能不小心添加了具有相应接口的函数。由于似乎只发现了公共功能,只要该功能是私有的或受保护的,这没有问题。
- 错误消息可以向客户端揭示有关软件的信息。这应该不是问题,因为软件本身是开源的。
显然,存在一些可以利用的编程错误空间。是否还有其他可能发生的不良副作用?我(或开发人员)应该如何判断这个功能带来的风险?
如果你认为它是安全的,我想知道为什么。