在我的代码我正在使用java.sql.PreparedStatement.
然后我执行该setString()方法来填充预准备语句的通配符.
在executeQuery()调用方法并执行查询之前,有没有办法检索(并打印出)最终查询?我只想将其用于调试目的.
我试图在java中放入一些反sql注入,并且发现很难使用"replaceAll"字符串函数.最后,我需要将任何现有的转换功能\来\\,任何"到\",任何'到\',任何\n以\\n使得当字符串由MySQL的SQL注入评估将被阻止.
我已经搞砸了一些我正在使用的代码,所有\\\\\\\\\\\功能都让我的眼睛变得疯狂.如果有人碰巧有这样的例子我会非常感激.
是否存在类似于PHP的mysql_real_escape_string()的Java?
这是为了在将它们传递给Statement.execute()之前逃避SQL注入尝试.
我知道我可以使用PreparedStatement,但我们假设这些是一次性语句,因此准备它们会导致性能降低.我已经将代码更改为使用PreparedStatement,但考虑到现有代码的结构,escape()函数会使代码更改更容易查看和维护; 我更喜欢易于维护代码,除非有一个令人信服的理由来增加复杂性.此外,PreparedStatements由数据库以不同方式处理,因此这可能使我们暴露于数据库中我们之前未遇到过的错误,在发布到生产之前需要进行更多测试.
Apache StringEscapeUtils escapeSQL()仅转义单引号.
后记:在我继承的环境中存在许多微妙之处,我在我的问题中故意避免.
需要考虑的两点:
1)准备好的语句不是灵丹妙药,也不能提供100%的SQL注入保护.某些数据库驱动程序使用不安全的字符串连接实例化参数化查询,而不是将查询预编译为二进制形式.此外,如果您的SQL依赖于存储过程,则需要确保存储过程本身不会以不安全的方式构建查询.
2)大多数预准备语句实现将语句绑定到语句被实例化的数据库连接上.如果您正在使用数据库连接池,则需要注意
仅使用准备好的语句引用与其准备的连接.一些池化机制确实透明地实现了这一点.否则,您也可以汇集预准备语句或(最简单但更多开销)为每个查询创建一个新的预准备语句.
I am looking for a way to escape strings for MySQL queries with Java.
But WAIT, before some of you jump straight away to the conclusion of "prepared statements", I wish to explain a little more.
The problem is, I don't have a MySQL connection. I am not executing any MySQL queries directly from Java. I don't know much about prepared statement, but AFAIK, prepared statements need a live connection to work.
我想让我的代码读入一堆 CSV/XLS 文件,获取数据,然后为 MySQL 生成一个巨大的 INSERT 查询。但是这个查询现在将存储在一个文本文件中。它不会执行,直到有人开绿灯并将此文本文件转储到数据库中。
有没有一种简单的方法可以在不使用矫枉过正的框架/库的情况下做到这一点?谢谢你们。