java - 在没有PreparedStatement的情况下清理Java中的数据库输入

标签 java mysql database sanitization

是否有一种可靠的方法可以在不使用准备好的语句的情况下清理 Java 中的数据库输入?

我找到的所有答案都建议使用PreparedStatement,但我试图避免与数据库服务器的额外往返。

-- 附加信息 --

  • 我的查询将非常简单,而且很少会共享相同的格式,因此任何查询计划缓存都没有什么性能优势。
  • 数据库服务器将位于单独的物理位置,但仍位于同一 LAN 中,因此使用准备好的语句时需要额外的往返,因此会出现额外的网络瓶颈。

我希望找到这样的东西,它存在于 C、Python 和 PHP 中: http://dev.mysql.com/doc/refman/5.0/en/mysql-real-escape-string.html

最佳答案

您可以在org.apache.commons.lang.StringEscapeUtils中使用escapeSql:

username="'; or 1=1";
sane_username=StringEscapeUtils.escapeSql(username);
// turns into "''; or 1=1"

sql= "select username from users where username = '" + sane_username + "'";
// select username from users where username = '''; 1 or 1'

但这确实是很糟糕的做法。您应该始终使用准备好的语句。

  • 节省 SQL Server 内存
  • 允许您重用 sql 语句而无需重新解析 sql, 提高性能
  • 为了更安全,您可能会忘记清理某些输入。

关于java - 在没有PreparedStatement的情况下清理Java中的数据库输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23901065/

相关文章:

java - 我应该如何在游戏中存储 map ?

Mysql - 获取由另一字段排序的一个字段的不同值

database - DDD 设计模式建议中的交易

java - 登录后Jsp和servlet与用户的getAttribute错误

java - 为什么AbstractQueuedSynchronizer的子类应该是内部类?

mysql - 获取每个 ID Mysql 的 2 个时间戳之间的前 N ​​行

c# - Visual Studio 2012 缺少数据源

php - Laravel:如果字段在传递到 `view` 之前有值,请检查 Controller

java - 对象映射器无法序列化对象类的引用

mysql - 从所有记录中查找匹配的问题