gpt4 book ai didi

java CallableStatement 与 SELECT 关于 SQL 注入(inject)

转载 作者:行者123 更新时间:2023-11-29 12:43:37 26 4
gpt4 key购买 nike

我希望能更好地理解 CallableStatement。所以情况是我的 postgre 数据库中有一个存储函数。

从参数是用户输入(HTTP POST 参数)的 java 调用这些函数我不得不担心 SQL 注入(inject)。

所以在 java 中这样做:

String statementSQL = "SELECT my_function(" + toPostgresString(person.getEmail()) + "," + toPostgresString(person.getPhone()) + "," + toPostgresString(person.getDealType())+ ");"; 

在哪里

private static String toPostgresString(String value) {
if (value == null || value.equals("")) {
return POSTGRES.NULL;
} else {
return "'" + value + "'";
}
}

后一种方法确保所有参数都被视为字符串,但我读到当参数是恶意的时,这种解决方案仍然很危险。

所以我尝试使用 CallableStatements,因为据说它们更安全。

CallableStatement statement = connection.prepareCall(" { call my_function( ?, ?, ? ) } ");

statement.setString(1, person.email());
statement.setString(2, person.phone());
statement.setString(3, person.getDealType());
statement.execute();
statement.close();

问题:在 SELECT 和 CallableStatement 两种情况下,参数都被发送到数据库函数,并在那里被视为由函数本身定义的数据类型。 CallableStatement 只有在数据类型不匹配时才会失败(在声明的函数和 statement.set() 中。

CallableStatement 实际上比 SELECT 更安全,在这两种情况下,参数都被视为字符串(但在 '' 之间)。

谢谢。

最佳答案

PreparedStatementCallableStatement 都提供了setXXX 方法来设置参数。他们实际上并没有清理参数,他们只是在网络上为它们使用二进制类型,所以“在这两种情况下,参数都被视为字符串”部分是错误的。

PreparedStatement 还提供了一些小的性能优势,因为在查询被调用足够多次后,驱动程序实际上会创建服务器端准备好的语句。

除非绝对必要,否则永远不要使用普通的 Statement,并且始终使用 setXXX 方法,因为这就是它们的用途。

关于java CallableStatement 与 SELECT 关于 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36859277/

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