这个简单的字符串转义可以防止任何 SQL 注入吗?

2024-01-01

我在一家公司工作,负责数据库模块的人员严格反对使用准备好的语句。我担心他的实施不安全。

以下是我们当前用于进行 SQL 查询的代码(带有 JDBC/MySQL 5.5 的 Java 8 应用程序):

String value = "Raw user input over HTTP-Form";
String sql = "SELECT * FROM db1.articles WHERE title like '" + 
replaceSingleQuotes(value) + "'";
executeSQL(sql);

public static String replaceSingleQuotes(String value) {
  value = value.replaceAll("\\\\", "\\\\\\\\");
  return value.replaceAll("'", "\\\\'");
}

我无法想出任何注射方法,但他的解决方案对我来说似乎很可疑。谁能指出如何规避这种转义?如果我想不出任何东西,并且我们的应用程序(银行)中拥有数千名客户的非常敏感的信息,他将不会替换他的代码。

编辑: 不幸的是,我无法显示executeSQL(),因为巨大的类层次结构很混乱,而且一切都分散了。但归结起来是这样的:

String query = ... // query escaped with the above function
java.sql.Connection connection = ...
Statement stmt = connection.createStatement();
stmt.executeUpdate(query);

一种攻击方法是“加载”攻击。

首先,您将用户名、银行转账消息等注入其中

转移0.01
至:02020.020202.200202
名称:johnny table';drop table foobar --

将被逃逸到

johnny tables\';drop table foobar  --

到目前为止,一切都很好。保护生效。我们的附加失败了。我们尝试加载攻击。

现在我们要做一个预定的付款订单。

这是假设发生了一个常见错误,即一旦插入数据库,该值就是“安全的”,因为它已经被检查过一次。

转移0.01
至:02020.020202.200202
名称:johnnytables';drop table foobar--
日程:1天后

将订单存储在数据库中

'johnny tables\';drop table foobar--'

将被存储为

约翰尼表';删除表 foobar--

现在,在午夜,调度程序启动并开始迭代预定的付款

select name from scheduled where time > x and < y

所以银行代码开始被压缩

String name = result['name'];
String acct = result['acct'];
String amt = result['amt'];
string query = "insert into payment_process (name,acct,amt) values('"+name+"','"+acct+"','"+amt+"');

砰,你的桌子掉了。*

当您采用手动路线时,您必须确保变量的所有、每个实例都被转义,所有 unicode 字符都被考虑在内,数据库引擎的所有特殊行为都被考虑在内。

此外,使用准备好的语句可以显着提高速度,因为您不必重建查询。您只需构建一次,将它们存储在缓存中,然后交换参数即可。
特别是在迭代大型列表时,它们是天赐之物。

根本问题是他可能不理解准备好的语句,不理解get他们如何工作。不安全感的触发可能会导致某种方式的攻击性和保护性,甚至是狂热,只是为了阻止承认你只是不知道它们是如何运作的。
尝试与他谈谈这件事,如果他不想听理由,请去找他的经理并解释问题,并且如果网站/应用程序被黑客攻击,这将由您的同事和您的同事承担经理,并告诉他风险是巨大的。以最近的黑客攻击为例,像 swift 黑客攻击一样,大量资金被盗。

* 实际上可能不起作用,取决于实际的查询、连接、联合等。这是一个非常简单的例子

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

这个简单的字符串转义可以防止任何 SQL 注入吗? 的相关文章

  • 在 Java 中将字符串复制到文件的开头

    我想将一个字符串写入文件的开头 我该怎么做 我根本不知道如何添加字符串 这就是我到目前为止所做的 public static void prepend String filename String data throws IOExcepti
  • 获取文本文件中行的字节偏移量?

    我有一个文本文件 例如 one two three four five 我需要获取文件中每一行的偏移量 我如何在 Java 中做到这一点 我搜索了一些 I O 库 如 BufferedReader 和 RandomAccessFile 但我
  • 将 Swing 集成到简单的文本冒险游戏中

    我对 Java 中的一些中级概念相当陌生 最近 我制作了一款名为 DazzleQuest 的文本冒险游戏 它完全在开发者控制台 终端中运行 它涉及到我的朋友作为角色 所以我想向他们展示它 并通过将命令行的功能和控制台的输出转移到一个简单的
  • rmi类找不到异常

    我使用 java rmi 编写了一个简单的项目并导出到可执行 jar 文件 当我尝试运行它时 有时会出现异常 有时会起作用 当我指定 Djava rmi server codebase file serverClasses 时 它似乎没有正
  • 基于两个数据库表之间的数据比较创建oracle视图

    我有下表 我想创建视图以便descr O 以及对于常见的id isin两个表中的字段值 检查ratio字段并只取其中的行ratio字段值低 for descr O 如果 id isin 存在于一个表中但不存在于另一个表中 则获取这些行 双向
  • 使用 PowerMock 和 TestNG 模拟单个静态方法

    class StaticClass public static String a return a public static String ab return a b 我想嘲笑StaticClass a以便它返回 x 并致电StaticC
  • 为什么在大多数开源java项目中局部变量没有被声明为final?

    如果我查看 OpenJDK Hibernate 或 Apache 中的 java 源代码 我还没有看到任何声明为 Final 的局部变量 这表明一些最广泛使用的 java 软件库的开发人员 不要相信final关键字可以提高可读性 不相信它会
  • 如何在 WebSphere Liberty Batch 中配置事务超时?

    的作用是什么javax transaction global timeout 我是否需要实施检查点 超时 中的方法检查点算法 服务器配置级别有什么东西吗 它如何与应用程序级别的设置进行交互 2016年12月2日编辑 重新设计并解释了为应用程
  • 当机器人攻击时! [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 XSSF 工作簿上设置密码保护

    我想为使用 poi 3 14 创建的 xlsx 文件添加密码保护 该文档声称 这是可能的 http poi apache org cryption html http poi apache org encryption html 使用我尝试
  • 使用 JPA 标准的“不在”约束

    我正在尝试写一个NOT IN约束使用JPA Criteria 我尝试过这样的事情 builder not builder in root get property1 虽然我知道这行不通 在上面的语法中 如何添加集合 列表property1会
  • 如何查找类路径中具有指定名称的所有资源?

    我想列出类路径中具有特定名称的所有文件 我预计会发生多次 因此Class getResource String 不管用 基本上 我必须识别类路径中任何位置具有特定名称 例如 xyz properties 的所有文件 然后累积读取其中的元数据
  • 如何使用 Java Streams API 将 Map 列表与列表值合并?

    我怎样才能减少Map
  • 何时对字符串文字使用 intern()

    我看到很多这样的遗留代码 class A public static final String CONSTANT value intern 我看不出使用 intern 的任何原因 因为在 Javadoc 中可以读到 所有文字字符串和字符串值
  • Thread.interrupt() 和 Thread.interrupted() 到底是如何工作的? [复制]

    这个问题在这里已经有答案了 从设置线程状态的角度来看 我不清楚这两种方法 Java 文档说 Thread interrupt 设置线程中断状态标志 调用 Thread interrupted 方法给出线程的状态并清除该标志 当这在实际场景中
  • 使用会话空闲超时进行轮询

    我对 Tomcat 中的所有应用程序使用单点登录 我的要求是 我必须轮询应从后端获取的事务状态 但它也不应该影响会话的空闲超时 有人可以建议是否可以做点什么吗 Thanx 我不知道是否有标准方法可以做到这一点 如果没有 你可以写一个过滤器
  • 将 JPanel 添加到 JFrame

    我有一个程序 其中将 JPanel 添加到 JFrame public class Test Test2 test new Test2 JFrame frame new JFrame Test frame setLayout new Bor
  • 如何在 Android 应用程序退出之前进行一些清理?

    当我的 Android 应用程序终止时 是否有某种 onTerminate 方法可以进行一些清理 我想清除一些 SharedPreferences 我有一个活动 它保持几个数字的运行平均值 并将其存储在 SharedPreference 中
  • Java Media API:java media api 下载

    我在哪里可以找到javax media jar 文件 在sun站点它下载一个安装程序 有没有可用的java媒体jar 没有 javax media 具体是 jar 文件 该包位于 jmf jar 文件中 您需要运行安装程序并取出 jar 或
  • 如何读取FTL文件中的JSONArray?

    我在我的 Java 文件中硬编码了以下 JSON 对象 JSONObject notificationInfoJson new JSONObject notificationInfoJson put title Payment Receiv

随机推荐