gpt4 book ai didi

java - 构建整个sql并使用preparedStatement运行它

转载 作者:行者123 更新时间:2023-11-29 07:30:33 25 4
gpt4 key购买 nike

我有一个用例,其中我尝试根据用户的 ip 创建整个 sql 到 api。

EG:用户使用以下格式访问 API:/what/table/field/field_value?name=value1

public static Result getRows(String what, String table, String field, String field_value, String more_where_clause) throws SQLException {
//more_where_clause will have as many condition for where clause

String sql = String.format("select ? from ? where ?=?");

if (!where.equals("")) {
sql += String.format(" and ?");
}
ResultSet rs = targetDB.query(sql, what, table, field, field_value, more_where_clause);



public <T extends Comparable<T>>ResultSet query(String sql, T... args) throws SQLException {
ResultSet rs = null;
try{
preparedStatement = conn.prepareStatement(sql);

for(int i=0; i<args.length; i++){
preparedStatement.setObject(i + 1, args[i]);
}
rs = preparedStatement.executeQuery();
}
catch(SQLException e)
{
e.printStackTrace();
}
return rs;
}

但是当我使用 say 查询它时:

/name/user_table/first_name/john?last_name=doe

我得到一个类似于

的 sql 字符串
select 'name' from 'user_table' where 'first_name'='john' and 'last_name=doe'
as preparedStatement.setObject(i + 1, args[i]);

将其推断为字符串。

有什么更好的方法可以做到这一点并避免 SQL 注入(inject)。编辑 :除了参数化 where 子句部分之外,我还可以执行哪些其他额外检查?我如何处理 more_where_clause 用户可以在 where 条件中输入更多内容。

最佳答案

您不能绑定(bind)名称(字段、表等),只能绑定(bind)值。

基于安全原则,您可以定义“白名单”正则表达式来检查名称是否符合您的限制(即仅允许 [A-ZaZ0-9_-]+)

较差的解决方案是定义一个“黑名单”,禁止双引号 (") 和转义序列(如果处理多个 RDBMS 引擎,这可能会很痛苦),然后将所有名称放在双引号之间。使用双引号时请注意区分大小写。

您还可以查看OWASP图书馆。我知道他们提供 API 来处理 HTML、CSS、JavaScript 和 HTTP 注入(inject)。可能他们还定义了 API 来处理生成的 SQL。

最终,您还可以构建/查询数据库元数据并将对象名称与提供的名称进行匹配。在这种情况下,您可以依赖值绑定(bind)。在这种情况下,不要忘记使用从元数据返回的值,并将它们用双引号括在生成的 SQL 中。

关于java - 构建整个sql并使用preparedStatement运行它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32791426/

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