当前位置: 首页 > 面试题库 >

快速而肮脏的SQL字符串转义

桓风史
2023-03-14
问题内容

我正在QueryBuilder为带有postgresql
DB的Web应用程序的家庭滚动类做最后的修饰。它PreparedStatement用于所有查询,并且可以防止SQL注入。

但是,我想要一种“快速而肮脏的”方式来表示QueryBuildertoString()方法,仅用于调试目的。该方法将按通常传递给的方式组装查询字符串PreparedStatement,然后只需将?字符串中的每个字符串替换为其相应的单引号值即可。该toString()Javadoc将警告其他开发者,这是一个不安全的近似仅用于调试,等等等等。

我知道这些值应将其单引号加倍(即O'Connell转义为O''Connell)。还有其他我要忘记的特殊字符吗?我寻找类似的问题,但只发现人们被责骂使用PreparedStatement(他们应该这样做,让记录显示)。

编辑: 不希望针对此特定任务使用第三方工具,我真的只想在这里快速又脏。我确实很喜欢这些链接-我可能会考虑将它们用于其他用途。

最后编辑: 感谢所有有用的指示。我只想补充一下,对于那些从Google跌跌撞撞来到这里的人,请 不要
将这些技巧用于任何触及数据库的东西,请使用PreparedStatement


问题答案:

对于“快速而肮脏的”转义,加倍撇号就足够了。但是,请注意字符串文字中已经存在的问号:

SELECT column FROM table WHERE column = 'A question?' or column = ?

您不想替换第一个问号。此外,这些极端情况还应注意:

SELECT /* Is this a comment?? */ * FROM table
-- -- --  Another comment??
WHERE column = ?

该语句中只有一个绑定值。但是,对于不太快捷的解决方案,您可以使用jOOQ之类的库来解决此问题(免责声明:我为jOOQ背后的公司工作)。它将为您进行内联,也将为更讨厌的数据类型做内联:

DSLContext ctx = DSL.using(SQLDialect.POSTGRES);
Object[] bindValues = { 1, "a'bc", Date.valueOf("2012-09-24"), "xy".getBytes() };
String string = ctx.query(
  "SELECT 1 WHERE A = ? AND B = ? AND C = ? AND D = ?",
  bindValues).toString();

以上将呈现

SELECT 1 
WHERE A = 1 
AND B = 'a''bc'
AND C = date '2012-09-24' 
AND D = E'\\170\\171::bytea


 类似资料:
  • 问题内容: 我有以下格式的日期字符串: 我需要将其更改为以下内容: 以前,我一直使用此库-> SwiftDate来操作日期,但现在不起作用。 我也尝试过类似的东西: 但这不起作用。我能怎么做? 提前致谢。 问题答案: 具有小数秒和时区的标准ISO8601日期格式为 yyyy-MM-dd’T’HH:mm:ss.SSSZ 斯威夫特3: 在macOS 10.13+中,iOS 11+ 是输入格式化程序的替

  • 问题内容: 我有一个映射到Swift的C函数定义为: 我正在尝试传递函数的路径并尝试过: 但是在path [i]上我得到了错误: ‘下标’不可用:不能下标Int范围的字符串 也不 也不管用 除了无法正常工作外,我认为还必须有一种更好,更轻松的方法来做到这一点。以前使用CString在StackOverflow上的答案似乎不再起作用。有什么建议? 问题答案: 使用CString在StackOverf

  • 在Objective-C中,我使用了以下内容:

  • 问题内容: 我需要以给定的精度将double转换为字符串。(或DecimalFormat)可以完成这项工作,但基准测试显示,即使转换速度不是非常快(在我的计算机上转换一百万个数字,大约需要1-3秒),它的速度仍然很慢。 有什么更好的方法吗? 更新:基准化结果 从0到1000000的随机数,结果是以毫秒为单位的操作数(Java 1.7.0_45) 更新: Java 10 + Ryu 问题答案: 免责

  • 问题内容: 如何快速将数组转换为 JSON 字符串?基本上,我有一个文本框,其中嵌入了一个按钮。按下按钮后,文本字段文本将添加到中。此外,我想将此数组转换为 JSON 字符串。 这是我尝试过的: 我也想使用我的方法返回 JSON 字符串。 问题答案: 就目前而言,您正在将其转换为数据,然后尝试将数据转换为JSON形式的对象(失​​败,不是JSON)并将其转换为字符串,基本上,您进行了一堆毫无意义的

  • 问题内容: 具有以下假设代码: 有什么方法可以将列表转换为c数组吗? 问题答案: 尝试以下代码。以下代码中的函数是您想要的。