【发布时间】:2010-09-17 03:27:57
【问题描述】:
我想要一些可以检查字符串是否为"SELECT"、"INSERT" 等的东西。我只是好奇它是否存在。
【问题讨论】:
标签: java sql-server
我想要一些可以检查字符串是否为"SELECT"、"INSERT" 等的东西。我只是好奇它是否存在。
【问题讨论】:
标签: java sql-server
很容易添加:
HashSet<String> sqlKeywords =
new HashSet<String>(Arrays.asList(
new String[] { ... cut and paste a list of sql keywords here .. }));
【讨论】:
如果您想防止 SQL 注入,最好利用 JDBC 的内置功能,例如预准备语句。一般来说,使用字符串连接来形成 SQL 语句是危险的。来自Preventing SQL Injection in Java:
准备好的陈述:
String selectStatement = "SELECT * FROM User WHERE userId = ? ";
PreparedStatement prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, userId);
ResultSet rs = prepStmt.executeQuery();
【讨论】:
为什么不从 this stored procedure 开始并修改它以满足您的需求,甚至可以按照 Steve 的建议使用 hashmap 将其转换为 Java。
我个人喜欢存储过程的想法,因为不同的数据库可能有不同的关键字,所以让数据库通过判断似乎很优雅
【讨论】:
DatabaseMetaData.getSQLKeywords 将返回 SQL-2003 中没有的数据库关键字(SQL-2003 关键字可以在标准中找到)。该接口中还有其他方法可用于获取各种类型的函数名称和类似名称。
正如 Chase Seibert 所说,不要认为这是阻止 SQL 注入攻击的有效方法。
【讨论】: