是否有一种可靠的方法可以在不使用准备好的语句的情况下清理 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/