当我使用JSF时,我试图使用以下代码查找ValueExpression:
public static final ValueExpression createValueExpression(
final FacesContext context, final ELContext elContext,
final String ev, final Class classType) {
return context.getApplication().getExpressionFactory()
.createValueExpression(elContext, ev, classType);
}
但是当我在HP fortify上运行这些代码时,说在运行时解释用户控制的指令可以让攻击者执行恶意代码。EL 表达式评估似乎存在代码注入的风险。但是我知道存在代码漏洞,所以我想知道如何防止EL注入?
谁能帮忙?
这里的表达式字符串"env"容易受到攻击者控制由Expression Language interpreter
评估的数据时发生的Expression Language Injection
的攻击。
对于解决方案,更有效的方法可能是针对不受信任的行为执行数据验证最佳做法输入并确保在数据到达EL层时应用输出编码,以便在评估之前,解释器不会在用户内容中找到元字符。最要检测的明显模式包括"${"和"#{",但可以编码或片段此数据。
因此,您可以在创建值表达式之前创建一个"白名单"模式来匹配表达式"evn"(白名单可以是:"[a-zA-Z0-9_.*#{}]*'(。
Pattern pattern = Pattern.compile("[a-zA-Z0-9_.*#{}]*");
Matcher matcher = pattern.matcher(ev);
if (!matcher.matches()) {
String message = "Detected a potential EL injection attack -
value["
+ ev+ "]";
throw new Exception(message);
}
风险是(就像例如.SQL注入一样(如果你让用户提供在EL中使用的输入(注释中正确指出的ev String(而没有适当的转义和/或其他基本安全措施,你将面临执行其他代码的风险。
如果不是这种情况,您可以忽略警告(希望它是警告,而不是阻止错误(