【发布时间】:2016-04-26 08:23:36
【问题描述】:
我希望能更好地理解 CallableStatement。 所以情况是我的 postgre 数据库中有一个存储函数。
从参数是用户输入(HTTP POST 参数)的 java 调用这些函数我不得不担心 SQL 注入。
所以在 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 相比如何更安全。
谢谢。
【问题讨论】:
标签: java sql-server postgresql sql-injection