Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 防止红移SQL注入_Java_Postgresql_Sql Injection_Mybatis_Amazon Redshift - Fatal编程技术网

Java 防止红移SQL注入

Java 防止红移SQL注入,java,postgresql,sql-injection,mybatis,amazon-redshift,Java,Postgresql,Sql Injection,Mybatis,Amazon Redshift,我遇到了一个不幸的情况,我必须通过连接字符串来建立一个SQL字符串,这是典型的SQL注入场景。我不能使用事先准备好的语句 如果我转义”字符,我安全吗?还是有其他攻击载体 我使用的是MyBatis,它是${}表示法(vs{}生成准备好的语句)。我别无选择,它必须是${}。我不能用事先准备好的陈述 编辑: 增加一点清晰度;这是一个很好的例子。卸载的第一个参数是SQL字符串。()确实是一种方法。一下子你就消除了一大堆关于黑客的工作和风险 如果您绝对不能/不会使用PreparedStatement,那么

我遇到了一个不幸的情况,我必须通过连接字符串来建立一个SQL字符串,这是典型的SQL注入场景。我不能使用事先准备好的语句

如果我转义
字符,我安全吗?还是有其他攻击载体

我使用的是MyBatis,它是
${}
表示法(vs
{}
生成准备好的语句)。我别无选择,它必须是
${}
。我不能用事先准备好的陈述

编辑:

增加一点清晰度;这是一个很好的例子。卸载的第一个参数是SQL字符串。

()确实是一种方法。一下子你就消除了一大堆关于黑客的工作和风险

如果您绝对不能/不会使用
PreparedStatement
,那么您需要阅读各种策略。您必须编写一系列检查来检查和修改输入和SQL。不(实际上,
PreparedStatement
是你的灵丹妙药,但没有其他灵丹妙药。)

谷歌搜索“清理sql输入”之类的项目。您可以找到以下资源:

  • (它告诉您使用PreparedStatement)
  • 关于SQL注入的维基百科页面
  • 第条
  • 这篇文章用例子解释了为什么消毒输入是不够的,并建议使用……是的,您猜对了:
    PreparedStatement
    • (由于红移的限制,您无法以正确的方式进行操作):

      在PostgreSQL上,将
      标准字符串设置为
      On
      只需使用双引号,将
      '
      转换为
      '
      。就这样

      除非
      标准字符串
      关闭或使用
      E''
      字符串,否则反斜杠并不重要。如果这两种情况都是真的,那么你就必须做反斜杠转义


      由于红移是基于一个古老的PostgreSQL版本的分支,我不知道这是如何应用于它的。阅读有关其词汇结构和语法的文档将是明智的,以验证它是否与PostgreSQL的工作方式一致。

      它是否能帮您摆脱
      ;下拉表--
      ?转义
      不足。还有其他攻击载体。你正在绞尽脑汁,然后询问赢得这场战斗的最佳方式。任何随机用户都可以对AWS上的数据库运行
      卸载
      ?它被记录为接受
      select
      语句作为第一个参数。它还会接受DDL或
      delete
      语句吗?它会接受多个SQL语句吗?这是一个AWS红移卸载,它坚持第一个参数是SQL字符串;或者不要使用UNLOAD。不,我建议3个选项:(1)什么都不做,对SQL注入持开放态度,(2)通过研究上面列出的文章来实现多重消毒检查,在不消除所有风险的情况下降低风险,以及(3)使用PreparedStatement,这样你就可以睡个好觉了。@BasilBourque:OP的打开程度取决于a)任何用户都可以运行
      unload
      ,还是只运行数据库超级用户;b)
      unload
      是否会拒绝多个SQL语句;c)
      unload
      是否会拒绝DML、insert、update和delete语句(合理,因为它的名字是
      unload
      ),d)我不知道,但我肯定忘了什么。OP需要测试这些东西。