gpt4 book ai didi

Java 枚举值和 SQL 注入(inject)

转载 作者:行者123 更新时间:2023-11-30 02:41:28 25 4
gpt4 key购买 nike

我有以下枚举:

public enum AccountStatus {

ENABLED,
CONFIRMATION_PENDING,
EXPIRED,
LOCKED,
DISABLED,
CREDENTIALS_EXPIRED,
}

我绑定(bind)到 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>

在我的 Controller 中,当我获取选定的复选框值时,我将字符串转换为枚举,如下所示:

AccountStatus accountStatus = AccountStatus.valueOf("selected string here");

然后在我的 DAO 中(使用 Spring JdbcTemplate),我使用所选值查询数据库:

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

jdbcTemplate.query(SQL, new MyMapper());

由于我使用 AccountStatus.valueOf(...) 验证每个用户选择的复选框,这种方式是否可以避免 SQL 注入(inject)?

最佳答案

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

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

重写此 SQL 以使用参数(最好是 named parameters )可以提高该 SQL 的易读性。此外,这将继续出现在每次代码审查、静态代码分析和代码审计中,如果我不得不继续回答有关它的问题,我会很恼火。但我理解想要避免接触正在运行的复杂东西。

关于Java 枚举值和 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41551897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com