JAVA - 可能的SQL注入

And*_*cci 2 java sql sql-injection jdbc secure-coding

所以我有这段代码:

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;
                }
Run Code Online (Sandbox Code Playgroud)

出于教育目的,即使我知道输入来自哪里,SQL语句是否受SQL注入保护?

fge*_*fge 6

ResultSet user = stat.executeQuery( "SELECT * FROM USER WHERE log_id='" + username + "';" );
Run Code Online (Sandbox Code Playgroud)

这是受SQL注入的.

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

John'; delete from user where 'a' = 'a
Run Code Online (Sandbox Code Playgroud)

是的,因为*Java JDBC SQL教程的加载错误.基本上,总是使用PreparedStatements.

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

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