4

当我使用 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 注入?

有人可以帮忙吗?

4

2 回答 2

2

这里的表达式字符串“env”很容易受到Expression Language Injection攻击,当攻击者控制由Expression Language interpreter.

对于解决方案,一种更有效的方法可能是针对不受信任的输入执行数据验证最佳实践,并确保在数据到达 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);
    }
于 2018-03-23T06:17:34.003 回答
1

如果您让用户提供在 EL 中使用的输入(注释中正确指出的 ev 字符串)而没有适当的转义和/或其他基本安全措施,则风险是(就像 SQL 注入一样),您将承担执行其他代码而不是您想要的代码的风险。

如果不是这种情况,您可以忽略警告(希望是警告,而不是阻塞错误)

于 2018-03-22T12:42:13.590 回答