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

2024-01-01

我正在对家庭卷进行最后的润色QueryBuilder具有 postgresql 数据库的 Web 应用程序的类。它用PreparedStatement适用于所有查询,并防止 SQL 注入。

然而我想要一种“快速而肮脏”的方式来表示QueryBuilder以其toString()方法,仅用于调试目的。该方法将按照通常传递到的方式组装查询字符串PreparedStatement,然后简单地替换每个?在字符串中及其相应的单引号值。这toString()javadoc 将警告其他开发人员,这是一个不安全的近似值,仅用于调试等。

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

EDIT:不想使用第三方工具来完成这个特定的任务,我真的只是想要快速而肮脏的工具。尽管如此,我还是很欣赏这些链接——我可能会考虑将它们用于其他用途。

最后编辑:感谢大家的有用指点。我只是想补充一点,对于任何从谷歌偶然发现这里的人,请做not使用这些技巧来处理任何访问数据库的事情,使用PreparedStatement.


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

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

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

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

该语句中只有一个绑定值。对于不太快速和肮脏的解决方案,您可以使用类似的库jOOQ http://www.jooq.org不过,对于这个问题(免责声明:我在 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速而肮脏的 SQL 字符串转义 的相关文章

  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • Supabase 客户端权限被拒绝,模式为 public

    每当我尝试使用 supabase supabase js 查询数据库时 都会收到错误 error hint null details null code 42501 message permission denied for schema
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 如何在 pg-promise 中设置模式

    我正在搜索的文档pg 承诺 https github com vitaly t pg promise特别是在创建客户端时 但我无法找到设置连接中使用的默认架构的选项 它始终使用public架构 我该如何设置 通常 为数据库或角色设置默认架构
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • SQL 更新 - 更新选定的行

    我正在使用 SQL Server 2008 我有一个名为MYTABLE有两列 ID STATUS 我想编写一个存储过程来返回其记录STATUS是 0 但是这个存储过程必须更新STATUS返回行数为 1 如何在单个查询中执行此选择和更新操作
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • 使用 GCC 和 Egypt 生成综合调用图

    我正在尝试生成一个全面的调用图 包括对 Linux 运行时等的低级调用 我使用 fdump rtl expand 静态编译了我的源文件并创建了 RTL 文件 我将其传递给名为 Egypt 的 PERL 脚本 我认为是 Graphviz Do
  • 在数据网格中查找文本框

    我有一个包含四列的数据网格 因此 从 C 端的这个数据网格中 我想找到 name headBox 的特定文本框 我该怎么做呢 我的该列的 xaml 如下所示 此部分位于 Datagrid Columns 中 该列位于名称 dgrid 的 d
  • 如何阻止某些记录在 SQL 查询中多次显示

    这里是完整的 SQL Fiddle http rextester com MTIFT55374 如您所见 记录来自recommendations表显示多次 但是如果我删除这一行LEFT JOIN cast ON cast cast tmdb
  • 为参数“appIdName”提供了“无效值”?

    我已经在这个应用程序上工作了几个星期 一切都很棒 我一直在建造 归档并玩得很开心 所有证书 个人资料和 ID 看起来 都井然有序且运行良好 然后几天前 似乎没有任何我能看出的变化 Xcode 说我没有任何 具有有效签名身份的配置文件 当我告
  • 在 ruby​​ 中,如何使用映射方法调用方法链?

    我将如何调用要使用的块 id to s在红宝石中 category ids categories map id to s 我正在破解它并立即执行以下操作 category ids categories each do c category
  • 基于 Maven POM 的自动化构建系统中依赖真实性验证

    我刚刚被指出一个非常有趣的article http www fortify com servlet downloads public fortify attacking the build pdf archived https web ar
  • HTML.ActionLink 方法

    假设我有课 public class ItemController Controller public ActionResult Login int id return View Hi id 在不位于 Item 文件夹的页面上 其中Item
  • 登录后出现404.0错误。 Asp.Net MVC 和 IIS 7.5

    我有一个在 IIS 7 5 上运行的 ASP NET MVC 应用程序 已启用表单验证 我可以访问登录页面 这意味着路线没问题 但是当我登录应用程序时应该将发布数据发送到http localhost tgpwebged Account Lo
  • Next.js 与 pkg。语法需要启用以下解析器插件之一:“flow, typescript”

    我使用 next js 与pkg https www npmjs com package pkg在我基于此的项目中tutorial https medium com evenchange4 deploy a commercial next
  • 重画问题

    我的方法中的重绘有问题move 我不知道该怎么做 代码如下 import java awt import java io import java text import java util import javax sound sample
  • 为什么 svn diff 有时会将工作文件复制到临时文件?

    我使用带有 Subversion 的外部 diff 工具 超越比较规则 其中一个很棒的功能是能够在我查看所做的更改时使用 diff 程序对文件进行一些细微的编辑 But svn diff我的不同项目的工作方式有所不同 总之 左侧文件是一个临
  • 带新行的 AlertDialog 消息。 (\n 不起作用。)

    我需要在AlertDialog在安卓上 我已经尝试过使用 n 字符 但它不起作用 我没有看到 n 字符 但文本不会换行 有什么帮助吗 您可以使用跨文本Html fromHtml some string br 在某些文本视图元素上创建新行
  • Android:如何为android活动制作翻转动画,就像iphone从左到右水平翻转一样?

    在我的应用程序中 我想翻转视图 我在iPhone上看过这样的动画 我想在我的 Android 应用程序中实现同样的功能 我想翻转整个活动视图 是否可以 我见过一些 android 中翻转的例子 但在所有示例中 视图都位于同一个活动中 是否可
  • 使用 jquery 禁用右键单击图像

    我想知道如何使用 jQuery 禁用右键单击图像 我只知道这个 这有效 img bind contextmenu function e return false 或者对于较新的 jQuery nearestStaticContainer o
  • Eclipse-导入代码格式设置

    您好 我正在使用 intellij 通过以下步骤添加代码设置 jar 导入设置 然后指向此 JAR 然后右键单击该模块并执行 重新格式化代码 但现在我在 eclipse 中使用相同的项目 如何在clipse和格式代码中使用上述设置jar 除
  • 如何使用robotium生成测试结果报告?

    我一直在使用 Robotium 来测试我的 Android 应用程序 测试成功 但我想知道是否有任何方法可以在单独的文件中查看测试结果 我很幸运 只是像常规 Android JUnit 测试一样运行 robotsium 测试 然后使用标准机
  • 如何设置activemq的队列最大长度

    我想知道是否可以在activemq上配置队列的最大长度 以便当队列的长度达到限制时 入队操作将失败或抛出异常 有人知道这个问题吗 任何帮助将不胜感激 多谢 看一下生产者流程控制http activemq apache org Produce
  • 如何查看 ASP.NET OutputCache 的内容?

    有什么方法可以列出当前存储在 OutputCache 中的页面吗 只需一个路径列表即可 但如果有一种方法可以获取有关每个项目的更多信息 过期等 那就更好了 据我记得缓存是一个单例 每个应用程序域只有一个实例 OutputCache 也使用它
  • MSTest 中 [TearDown] 和 [SetUp] 的替代方案是什么?

    当我使用 MSTest Framework 并复制 Selenium IDE 为我生成的代码时 MSTest 无法识别 TearDown and SetUp 有什么替代方案吗 你会使用 TestCleanup and TestInitial
  • 快速而肮脏的 SQL 字符串转义

    我正在对家庭卷进行最后的润色QueryBuilder具有 postgresql 数据库的 Web 应用程序的类 它用PreparedStatement适用于所有查询 并防止 SQL 注入 然而我想要一种 快速而肮脏 的方式来表示QueryB