繁体   English   中英

JAVA-可能的SQL注入

[英]JAVA - Possible SQL Injection

所以我有以下代码片段:

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注入的影响?

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

这受SQL注入的约束。

想象一下,如果username具有以下值会发生什么:

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

是的,因为*大量的Java JDBC SQL教程都弄错了。 基本上,始终使用PreparedStatement

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

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

正如在解释这个帖子 ,一个流氓攻击者可以执行以下操作来yoour应用:

  • 调用sleep函数,以便所有数据库连接都将繁忙,因此使您的应用程序不可用
  • 从数据库中提取敏感数据
  • 绕过用户认证

不仅SQL会受到影响。 如果不使用绑定参数,则即使JPQL也会受到损害。

最重要的是,在构建SQL语句时,绝对不要使用字符串连接。 为此使用专用的API:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM