如何使用 EL 表达式防止代码注入
How to prevent code injection with EL expression
当我使用 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注入?
有人能帮忙吗?
风险是(就像 SQL 注入一样)如果你让用户提供在 EL 中使用的输入(注释中正确指出的 ev 字符串)而没有适当的转义 and/or 其他基本安全措施,您将面临执行其他代码而不是您想要的代码的风险。
如果不是这样,可以忽略警告(希望是警告,不是阻塞错误)
这里的表达式字符串 'env' 可能容易受到 Expression Language Injection
的攻击,当攻击者控制由 Expression Language interpreter
.
评估的数据时,就会发生这种情况
对于解决方案,更有效的方法可能是针对不受信任的数据执行数据验证最佳实践
输入并确保在数据到达 EL 层时应用输出编码,以便
在评估之前,解释器在用户内容中没有找到元字符。最多
要检测的明显模式包括“${“和”#{“,但可能会编码或分段
这个数据。
因此您可以在创建值表达式之前创建一个 'whitelist' 模式来匹配表达式 '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);
}
当我使用 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注入?
有人能帮忙吗?
风险是(就像 SQL 注入一样)如果你让用户提供在 EL 中使用的输入(注释中正确指出的 ev 字符串)而没有适当的转义 and/or 其他基本安全措施,您将面临执行其他代码而不是您想要的代码的风险。
如果不是这样,可以忽略警告(希望是警告,不是阻塞错误)
这里的表达式字符串 'env' 可能容易受到 Expression Language Injection
的攻击,当攻击者控制由 Expression Language interpreter
.
对于解决方案,更有效的方法可能是针对不受信任的数据执行数据验证最佳实践 输入并确保在数据到达 EL 层时应用输出编码,以便 在评估之前,解释器在用户内容中没有找到元字符。最多 要检测的明显模式包括“${“和”#{“,但可能会编码或分段 这个数据。
因此您可以在创建值表达式之前创建一个 'whitelist' 模式来匹配表达式 '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);
}