Java枚举值和SQL注入

Java枚举值和SQL注入,java,sql,jdbc,sql-injection,jdbctemplate,Java,Sql,Jdbc,Sql Injection,Jdbctemplate,我有以下枚举: public enum AccountStatus { ENABLED, CONFIRMATION_PENDING, EXPIRED, LOCKED, DISABLED, CREDENTIALS_EXPIRED, } 我绑定到JSP表单中的复选框: <li><form:checkbox path="accountStatus" value="ENABLED" label="Enabled" /></

我有以下枚举:

public enum AccountStatus {

    ENABLED,
    CONFIRMATION_PENDING,
    EXPIRED,
    LOCKED,
    DISABLED,
    CREDENTIALS_EXPIRED,
}
我绑定到JSP表单中的复选框:

<li><form:checkbox path="accountStatus" value="ENABLED" label="Enabled" /></li>
<li><form:checkbox path="accountStatus" value="CONFIRMATION_PENDING" label="Confirmation Pending" /></li>
...
<li><form:checkbox path="accountStatus" value="CREDENTIALS_EXPIRED" label="Credentials Expired" /></li>
然后在我的DAO(使用Spring JdbcTemplate)中,我使用所选的值查询数据库:

String SQL = "SELECT * FROM TABLE_A WHERE column = \'" + accountStatus.name() + "\'";

jdbcTemplate.query(SQL, new MyMapper());
由于我正在使用AccountStatus.valueOf(…)验证每个用户选择的复选框,因此这种方法对SQL注入安全吗?

您也可以使用

该库包含许多有用的util类

TypeEnum strTypeEnum = null;

// check if string makes valid enum
if( EnumUtils.isValidEnum(TypeEnum.class, str) ){
    strTypeEnum = TypeEnum.valueOf(str);
}

对于如何显示设置的枚举值,不会有人注入任意SQL的危险。攻击者可以发送无效的枚举名,但valueOf在无法将其与有效值匹配时会抛出IllegalArgumentException

如果出于某种原因不应输入有效的枚举值(例如,特定角色没有权限查找具有禁用值的条目),则在没有其他服务器端验证的情况下,攻击者可以将该条目更改为该有效但不允许的值。因此,这可能是一种攻击,您可以通过添加更多验证(在我的示例中,检查是否允许用户角色使用enum值)来补救这种攻击


重写此SQL以使用参数(最好)将提高其易读性。而且,每次代码审查、静态代码分析和代码审计中都会出现这种情况,如果我不得不不断地回答有关它的问题,我会很恼火。但我明白,我希望避免接触正在工作的复杂事物。

为什么不使用参数化查询呢?我的SQL查询更复杂,我只写了一个简单的示例。因此,我必须根据用户输入的值动态生成SQL查询。因此,您仍然可以参数化。我认为我不必参数化,因为我使用的是枚举值,但我不确定。这是一个复杂的搜索引擎,如果安全的话,我认为没有必要修改它。
TypeEnum strTypeEnum = null;

// check if string makes valid enum
if( EnumUtils.isValidEnum(TypeEnum.class, str) ){
    strTypeEnum = TypeEnum.valueOf(str);
}