我知道使用Prepared Statements是防止sql注入的最佳方法(以及未经检查的输入中未转义字符导致的语法错误).
我目前的情况是我正在编写一些Java代码来将数据从一个第三方应用程序移动到另一个应用程序.目标应用程序使用Sybase的专有版本,因此虽然我确实有JTDS JDBC驱动程序,但PreparedStatement失败,因为驱动程序使用的临时存储过程在数据库的这种特殊风格中不受支持.所以我只有Statement才能使用,我无法控制用户输入,因为它来自另一个应用程序.
有this similar question但是这侧重于修复问题,如果你有一个参数,例如一个无法通过Prepared Statement处理的表.我的情况不同,希望更简单,因为我有简单的sql语句.我想知道是否有最佳实践来复制类似下面的内容而不使用PreparedStatement:
PreparedStatement statement = connection.prepareStatement("UPDATE mytable SET value=? WHERE id=?"); statement.setInt(1,getID()); statement.setString(2,userInput); statement.executeUpdate();
所以我想问题是如何可靠地清理用户输入?我可以尝试从头开始自己做,但这似乎是一个坏主意,因为可能至少有一个我会想念的边缘情况,所以我希望那里有一个库可以为我做这个,但是到目前为止我还没能找到一个.
解决方法
ESAPI库具有
escaping input for SQL的过程,并在必要时开发自己的特定于db的编码器.