有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java这段代码SQL注入安全吗?

这是否会阻止SQL注入,还是必须用preparedStatement.setString()传递参数

String sqlQuery = "select st from master where st_id= %1s ";

sqlQuery = String.format(sqlQuery, id);
preparedStatement = conn.prepareStatement(sqlQuery);
rs = preparedStatement.executeQuery();

这不是代码审查,上面的代码是问题的一个示例


共 (1) 个答案

  1. # 1 楼答案

    您直接在SQL代码中嵌入用户输入,如下所示:

    String.format(sqlQuery, id)
    

    有效地将用户输入作为代码运行。所以,不,这对SQL注入来说是不安全的。这是SQL注入的定义

    不要直接将用户输入嵌入到SQL代码中,而是使用prepared statement中的参数将用户输入视为,而不是代码。基本上,问题会变成这样:

    String sqlQuery = "select st from master where st_id= ? ";
    

    然后使用语言中的工具将参数值添加到查询中:

    preparedStatement = conn.prepareStatement(sqlQuery);
    preparedStatement.setInt(1, id); // < - here
    rs = preparedStatement.executeQuery();
    

    旁注:有些人可能会指出,如果id是一种非字符串类型,那么这段代码仍然不会受到SQL注入的影响,因为没有人可以将任何危险的作为数字注入。虽然这在任何特定情况下都可能是偶然的,但这并不能保证,也不是安全的做法

    始终将用户输入视为值,而不是代码。无论输入的类型是什么,或者你对输入的来源有多确定。不要给攻击者任何攻击途径,即使你想不出他们可以利用它的任何方式