2

所以我有这段代码:

String username = props.getProperty("jdbc.username");
try {
                String username = parts[1];

                // Check procedure
                System.out.println("Checking user");

                // Check database user table for username
                conn = getSQLConnection();
                Statement stat = conn.createStatement();
                ResultSet user = stat.executeQuery( "SELECT * FROM USER WHERE log_id='" + username + "';" );
                // Check given password against user entry
                if(user.next()){
                    System.out.println("User Exists: " + username);
                    sendMessage("true");
                    return;
                }
                else{

                    System.out.println("User Does Not Exist: " + username);
                    sendMessage("false user");
                    return;
                }

出于教育目的,即使我知道输入来自何处,SQL 语句是否也不会受到 SQL 注入的影响?

4

2 回答 2

6
ResultSet user = stat.executeQuery( "SELECT * FROM USER WHERE log_id='" + username + "';" );

这会受到 SQL 注入的影响。

想象一下如果username有这个值会发生什么:

John'; delete from user where 'a' = 'a

是的,因为 Java JDBC SQL 教程的*负载弄错了。基本上,总是使用PreparedStatements。

不仅因为这使得即使username具有上述恶意值也不能安全使用,而且更重要的是,因为相同的查询可以被 RDBMS 引擎重用于所有进一步的调用。

简而言之,完全没有理由不使用它们。使用字符串连接演示 SQL 的教程应该会死于痛苦的 SQL 注入死亡。

于 2015-04-20T21:45:44.127 回答
0

本文所述,一个流氓攻击者可以对您的应用程序执行以下操作:

  • 调用 sleep 函数,使您的所有数据库连接都处于忙碌状态,从而使您的应用程序不可用
  • 从数据库中提取敏感数据
  • 绕过用户认证

不仅 SQL 会受到影响。如果您不使用绑定参数,甚至 JPQL 也会受到影响。

最重要的是,在构建 SQL 语句时,您永远不应该使用字符串连接。为此目的使用专用 API:

于 2016-11-08T15:02:41.567 回答