sql注入例子

package cn.itheima.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.Test;

/**
 * 测试sql注入问题
 * 
 * @author Never Say Never
 * @date 2016年7月28日
 * @version V1.0
 */
public class TestLogin {

    @Test
    public void testLogin() {
        try {//真正的用户名和密码应该是 username和123
              login("username", "123");//下面是两个注入的例子,使用login1()可以避免被注入
            //login("gongji'or '1", "123");//这种方法使得非法的错误的用户名可以登录
            // login("gongji'or 1 or ", " or '");//这种方法在不知道用户名和密码的情况下也可以进行登录
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 用户登录方法
     * 
     * @param username
     * @param password
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public void login(String username, String password) throws ClassNotFoundException, SQLException {
        // 1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 2.获取连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123");
        // 3.创建执行sql语句的对象
        Statement stmt = conn.createStatement();
        // 4.书写一个sql语句
        String sql = "select * from users where " + "uname='" + username + "' and upassword='" + password + "'";
        // 5.执行sql语句
        ResultSet rs = stmt.executeQuery(sql);
        // 6.对结果集进行处理
        if (rs.next()) {
            System.out.println("恭喜您," + username + ",登录成功!");
            System.out.println(sql);
        } else {
            System.out.println("账号或密码错误!");
        }
        if (rs != null)
            rs.close();
        if (stmt != null)
            stmt.close();
        if (conn != null)
            conn.close();
    }

    public void login1(String username, String password) throws ClassNotFoundException, SQLException {
        // 1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 2.获取连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123");
        // 3.编写sql语句
        String sql = "select * from users where uname=? and upassword=?";
        // 4.创建预处理对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        // 5.设置参数(给占位符)
        pstmt.setString(1, username);
        pstmt.setString(2, password);
        // 6.执行查询操作
        ResultSet rs = pstmt.executeQuery();
        // 7.对结果集进行处理
        if (rs.next()) {
            System.out.println("恭喜您," + username + ",登录成功!");
            System.out.println(sql);
        } else {
            System.out.println("账号或密码错误!");
        }
        if (rs != null)
            rs.close();
        if (pstmt != null)
            pstmt.close();
        if (conn != null)
            conn.close();
    }
}

补充说明:在注入过程中,发现sql 语句中的数字有或没有引号都可以正常执行,关于这个问题的讨论

你可能感兴趣的:(sql注入例子)