在 Java 中转义 SQL 字符串

2023-11-21

背景:

我目前正在为企业 CMS 数据库(业务对象)开发 Java 前端。目前,我正在构建一个功能来允许用户构建自定义数据库查询。我已经实施了措施,以确保用户只能使用已批准用户访问的可用列和运算符的子集进行选择(例如,可以选择 SI_EMAIL_ADDRESS,而不能选择 SI_CUID 等更强大的字段)。到目前为止,一切进展顺利,但现在是时候确保此功能免受潜在的 SQL 注入攻击了。

问题:

我正在寻找一种转义用户输入字符串的方法。我已经看过 PerparedStatement,但是我被迫使用第三方 API 来访问数据库。这些 API 对我来说是不可变的,直接数据库访问是不可能的。各个方法采用表示要运行的查询的字符串,从而使PreparedStatement 无效(据我所知,它必须针对直接数据库连接运行)。

我考虑过使用 String.replace(),但如果可能的话我不想重新发明轮子。另外,我与开发PreparedStatement的安全专家相差甚远。

我还查看了 PerparedStatement 的 Java API 参考,希望找到某种 toString() 方法。唉,我一直找不到类似的东西。

任何帮助是极大的赞赏。先感谢您。

参考:

Java - 转义字符串以防止SQL注入

PHP 的 mysql_real_escape_string() 的 Java 等效项


当然使用PreparedStatement会更简单、更安全。

ANSI SQL 要求字符串文字以单引号开头和结尾,单引号的唯一转义机制是使用两个单引号:

'Joe''s Caffee'

所以理论上,你只需要用两个单引号替换一个单引号即可。然而,也存在一些问题。首先,某些数据库(例如 MySQL)也(或仅)支持反斜杠作为转义机制。在这种情况下,您还需要将反斜杠加倍。

对于 MySQL,我建议使用MySQL实用程序。如果您不使用 MySQL,那么您需要检查要使用的确切转义机制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中转义 SQL 字符串 的相关文章

随机推荐

  • Google Chrome .dev 无法通过 http 工作 [重复]

    这个问题在这里已经有答案了 自上次更新以来谷歌浏览器 63 0 3239 84 the dev我的本地开发计算机的域不再工作 因为浏览器强制 URL 通过 https 并且我的本地计算机上没有 sicure 证书 有没有办法让它与 dev
  • 64 位 iOS 设备上的 asm("trap")

    在我自己开发的断言宏中 我一直在 iOS 设备上使用 asm trap 或在 iOS 模拟器上使用 asm int3 来中断调试器 然而 在设备的 64 位版本中 我得到了陷阱指令的 无法识别的指令助记符 有与arm64相当的吗 像 bui
  • 使用 feed_dict 比使用数据集 API 快 5 倍以上?

    我创建了一个 TFRecord 格式的数据集进行测试 每个条目包含 200 列 名为C1 C199 每个都是一个字符串列表 和一个label列来表示标签 创建数据的代码可以在这里找到 https github com codescv tf
  • Pyplot 交互式缩放

    我想显示首次显示时放大的图像 但仍然可以使用图窗工具栏中的交互式 重置原始视图 按钮缩小到全尺寸 裁剪是完全不可接受的 使用plt axis x0 x1 y0 y1 确实允许平移 但交互式窗口不会重置为全尺寸 有没有办法触发情节缩放或以其他
  • AWS Lambda HTTP API 网关集成上不可能实现 CORS

    创建了返回 3 个 HTTP 标头的 AWS Lambda 函数 NodeJS aaa Access Control Allow Origin 和 bbb exports handler async event gt const respo
  • 如何判断一棵二叉树是否完整?

    完全二叉树被定义为其中每个级别 可能除了最深的级别 都被完全填充的二叉树 在最深层 所有节点必须尽可能位于左侧 我认为一个简单的递归算法将能够判断给定的二叉树是否完整 但我似乎无法弄清楚 如同 height t if t NULL then
  • 从关系中选择最常见的值 - SQL 语句

    我的数据库中有一个表 其中包含许多记录 某些记录的其中一列共享相同的值 例如 id name software 1 john photoshop 2 paul photoshop 3 gary textmate 4 ade firework
  • 从 Google App Engine 导出/导入数据存储

    我想将 App Engine 中运行的数据存储导出到应用程序的本地 独立 版本中 有人知道我该怎么做吗 我一直在 App Engine 仪表板中查找 但找不到它 查看文档上传和下载数据
  • 如何通过 RDP 连接到我的 Azure 云服务? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 正如我所读到的 每个 Azure 云服务背后都有一个虚拟机 对吗 我知道 对于虚拟机 我可以单击 连接 按钮来获取 rdp 文件以进行远程登录 但是 对于我的云服务 正在运行 连接
  • Firebase 存储对象的下载 URL 是否永久存在?

    当您将文件上传到 Firebase 的存储然后询问对象 URL 时 您会得到一个可公开访问的 URL 例如http firebasestorage googleapis com v0 b appname o filename alt med
  • Android:在哪里可以找到 RadioButton Drawable?

    好的 我正在尝试创建一个名为的自定义视图CheckedRelativeLayout 它的目的与CheckedTextView 以便能够在您想要选择的项目列表中或在Spinner 现在一切正常 我延长了RelativeLayout并实施了Ch
  • 是否可以代表用户在我的网站上禁用第三方 cookie?

    我有一个从另一个网站加载资源的网站 我已经能够确定 第三方网站在用户的浏览器上放置cookie 如果我在浏览器设置中禁用第三方 Cookie 则第三方网站将无法再在浏览器上放置 Cookie 该资源仍然可以正常工作 我想知道我是否可以从我的
  • 内核崩溃后获取 Linux 内核调试信息

    有没有办法在内核崩溃发生后获取内核以前的调试信息 我正在尝试开发一个内核模块 它基本上捕获内核网络堆栈内IP层中的IP数据包 经过一些修改后 我必须将相同的数据包发送回NIC进行传输 在所有这些过程中 我在以下的帮助下编写调试信息print
  • 在div中隐藏滚动条

    有没有办法使用CSS隐藏滚动条同时仍保留其功能 甚至使其透明或与背景颜色相同也可以 我必须在 JavaScript 中执行此操作吗 className overflow auto overflow y hidden 我相信用户必须使用鼠标滚
  • 当绑定的列表视图没有项目时显示一些文本

    以下是我的列表视图的语法 它绑定到一个类
  • 在 FreeAndNil 之后使用对象时会发生什么?

    在我的Delphi7中这段代码 var MStr TMemoryStream FreeAndNil MStr MStr Size 0 生成 AV 模块 Project1 exe 中地址 0041D6D1 处的访问冲突 读取地址 000000
  • HttpListener 服务器标头 c#

    我正在尝试为个人项目编写一个 C http 服务器 我想知道如何将返回的服务器标头从 Microsoft HTTPAPI 2 0 更改为其他内容 public class HttpWebServer private HttpListener
  • 使用单击一次部署时出现安装问题

    我有一个 Wpf 应用程序 我希望将其部署在远程服务器上 以前我使用 VS2010 因此创建 setup msi 文件并部署到其他计算机上会很容易 目前我有VS2012 它没有设置部署选项 另外 我还阅读了有关 clickonce 应用程序
  • 如何在iOs中将UITabbarController添加到UIViewController

    如何用TabbarController推送Viewcontroller 在Viewcontroller XIB中 我创建了UITabbarController 然后我推送这个ViewController 但它没有出现UITabbarCont
  • 在 Java 中转义 SQL 字符串

    背景 我目前正在为企业 CMS 数据库 业务对象 开发 Java 前端 目前 我正在构建一个功能来允许用户构建自定义数据库查询 我已经实施了措施 以确保用户只能使用已批准用户访问的可用列和运算符的子集进行选择 例如 可以选择 SI EMAI