gpt4 book ai didi

java - 防止表单生成的 SQL 注入(inject) SQL - NO PreparedStmts

转载 作者:搜寻专家 更新时间:2023-11-01 01:38:50 25 4
gpt4 key购买 nike

我有一个搜索表,用户可以在其中使用以下类型的过滤器来过滤结果:

  • 字段 [姓名]、值 [约翰]、删除规则
  • 字段 [姓氏],值 [布莱克],移除规则
  • 字段[有 child ],值[是],移除规则
  • 添加规则

因此,用户将能够设置任意一组过滤器,这基本上会产生一个完全动态的 WHERE 子句。以后我还要实现更复杂的逻辑表达式,比如

其中 (name=John OR name=Nick) AND (surname=Blake OR surname=Bourne),

在用户可能会或可能不会过滤的所有 10 个字段中,我不知道用户将设置多少以及哪些过滤器。所以,我不能使用准备好的语句(假设至少我们知道 WHERE 子句中的字段)。这就是为什么准备好的语句不幸的是不可能的,我必须用普通的旧的、生成的 SQL 来做。

我可以采取什么措施来保护应用程序免受 SQL 注入(inject)(REGEX 方式或任何其他方式)?

最佳答案

Java,未经测试。

List<String> clauses = new ArrayList<String>();
List<String> binds = new ArrayList<String>();

if (request.name != null) {
binds.add(request.name);
clauses.add("NAME = ?");
}

if (request.city != null) {
binds.add(request.city);
clauses.add("CITY = ?");
}

...

String whereClause = "";

for(String clause : clauses) {
if (whereClause.length() > 0) {
whereClause = whereClause + " AND ";
}
whereClause = whereClause + clause;
}

String sql = "SELECT * FROM table WHERE " + whereClause;

PreparedStatement ps = con.prepareStatment(sql);

int col = 1;
for(String bind : binds) {
ps.setString(col++, bind);
}

ResultSet rs = ps.executeQuery();

关于java - 防止表单生成的 SQL 注入(inject) SQL - NO PreparedStmts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2852530/

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