gpt4 book ai didi

java - 防止该语句被SQL注入(inject)

转载 作者:行者123 更新时间:2023-12-01 18:30:54 27 4
gpt4 key购买 nike

我正在尝试使用 PreparedStatement 类编写一个非常简单的查询。我在这里读到:Fail to convert to internal representation JDBC您不能参数化列名,只能参数化值。由于我的查询非常简单,因此我可以参数化的唯一“值”是 count (*)

这是查询:从 EZ_DAY 中选择 COUNT (*) 条

如果我尝试像这样参数化它:选择?从 EZ_DAY 开始

我收到一个错误:无法转换为内部表示ResultSet 上使用方法 getInt() 时。

如何使用 PreparedStatement 并参数化此查询中的某些内容以防止 SQL 注入(inject)?我也知道你不能参数化列名,这包括表名吗?例如,我可以这样做:

从 中选择 COUNT (*) 个?

最佳答案

该查询不能陷入 SQL 注入(inject)。属于此类别的查询是通过纯字符串连接构建的查询。例如:

String query = "SELECT COUNT(*) FROM EZ_DAY WHERE colX = " + stringParameter;
Statement stmt = con.createStatement(query);
ResultSet rs = stmt.executeQuery();

就您的情况而言,没有要注入(inject)的参数,因此无法针对您的特定情况进行 SQL 注入(inject)攻击。

如果需要防止 SQL 注入(inject)攻击,请使用 PreparedStatement 并且不要连接查询。相反,通过接口(interface)传递参数,这将为您转义任何无效字符:

String query = "SELECT COUNT(*) FROM EZ_DAY WHERE colX = ?";
PreparedStatement pstmt = con.prepareStatement(query);
pstmt.setString(1, stringParameter);
ResultSet rs = pstmt.executeQuery();

如果您需要构建动态查询,那么您可能会退回到连接字符串,无论您使用纯字符串连接还是 StringBuilder:

//Common solution, still suffers from SQL injection
String query = "SELECT COUNT(*) FROM EZ_DAY WHERE 1 = 1 ";
if (stringParameter != null) {
query = query + = "AND colX = " + stringParameter;
}

相反,最好对参数使用 COALESCEIFNULL 函数以避免此类情况:

//Better solution
String query = "SELECT COUNT(*) FROM EZ_DAY WHERE colx = COALESCE(?, colx)";

在上面的例子中:

  • 如果参数的值与 null 不同,则查询将如下所示:

    String query = "SELECT COUNT(*) FROM EZ_DAY WHERE colx = ?";
  • 如果参数具有 null 值,则查询将如下所示:

    String query = "SELECT COUNT(*) FROM EZ_DAY WHERE colx = colx";

在最后一个示例中,您仍然可以使用 PreparedStatement 并避免 SQL 注入(inject)攻击。

相关:

关于java - 防止该语句被SQL注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24267112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com