【问题标题】:How to remove single qotes from sql prepared statement如何从sql准备语句中删除单引号
【发布时间】:2020-01-14 07:51:17
【问题描述】:

我正在开发已经存在 sql 查询的 java 代码,但它会导致 sql 注入,我正在使用 setString 方法来避免 sql 注入。但是 setstring 为参数值添加了单引号,所以我的查询失败了。如何删除 setString 方法的单引号。

我尝试使用 replaceAll 方法,但它不适用于预先声明的语句。

String X="where IP ?";

String Y=" group by user";

String Z="order by descend";

query="select appname,user,IP from xyz "+X+" "+Y+Z; --> this is existing query.

我将查询更改如下

query="select appname,user,IP from xyz ? ? ?"; 

Object=connectionObj.prepareStatement(query);

Object.setString(1,X);

Object.setString(2,Y);

Object.setString(3,Z);

但是这里的 setString 方法是为值添加单个 quoes,所以我的查询由于语法错误而失败。我尝试了 replceAll("'"," ") 方法,但它只适用于字符串,不适用于准备好的语句。我遇到语法错误。请帮助我在 JAVA 中解决这个问题。

【问题讨论】:

  • 这可能只是一个例子,但不要命名变量Object。令人困惑。
  • from xyz ? ? ? 应该是什么意思?这可能不是有效的 SQL 语法。
  • 只能参数化,不能查询片段。
  • @Tim - 看起来他们正试图提供 SQL 命令文本的片段作为参数值,例如,group by user
  • @Gord 我认为你是对的。有解决方法,但仍然很难给出明确的答案。

标签: java mysql sqlite jdbc


【解决方案1】:

您正在尝试做的也是 SQL 注入。 X、Y 和 Z 的值从何而来?根据您的业务需求对您的程序进行编码以构建 SQL,使用 StringBuilder 从您的程序中添加 SQL 片段。如果您可以控制片段,则不是 SQL 注入。您应该只将参数 (?) 用于与表中的数据进行比较的值。如果您需要动态创建 SQL,也可以考虑使用 myBatis 之类的工具。

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多