剖析JDBC代码——SQL注入攻击(浅显易懂)——Statement

1、创建一个模拟的类UserLogin

package com.sie.train;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class UserLogin {
	public static void main(String[] args) {
		//(1)从控制台输入用户名与密码
		Scanner scanner=new Scanner(System.in);
		System.out.print("请输入用户名:");
		String uname=scanner.nextLine();
		System.out.print("请输入密码:");
		String pwd=scanner.nextLine();
		
		//(2)连接数据库,先判断用户名存不存在再判断用户密码有没有输入正确
		String url="jdbc:oracle:thin:@61.145.96.125:1522:DEMO";
		String user="apps";
		String password="apps";
		//用Statement的安全性低,容易被SQL注入攻击例如:用户名:admin 密码:1' OR '1'='1,就可以成功登陆
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection conn=DriverManager.getConnection(url,user,password);
			String sql="SELECT * FROM T_User  WHERE uname='"+uname+"' AND passwd ='"+pwd+"'";
			Statement stmt=conn.createStatement();
			ResultSet rs=stmt.executeQuery(sql);
			System.out.println(sql);
			if (rs.next()){
				System.out.println("登陆成功!");
				
			}else{
				System.out.println("登陆失败!");
			}
			rs.close();
			stmt.close();
			conn.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

2、结果如下:
控制台模仿登陆

3、Statemant另外一种防止SQL注入的写法:

package com.sie.train;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class UserLogin{
	// @UserLogin1 Statement防SQL注入的写法
	public static void main(String[] args) {

		// (1)从控制台输入用户名与密码
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入用户名:");
		String uname = scanner.nextLine();
		System.out.print("请输入密码:");
		String pwd = scanner.nextLine();

		// (2)连接数据库,先判断用户名存不存在,再判断用户密码有没有输入正确
		String url = "jdbc:oracle:thin:@61.145.96.125:1522:DEMO";
		String user = "apps";
		String password = "apps";

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection conn = DriverManager.getConnection(url, user, password);
			String sqlUname = "SELECT uname FROM T_User  WHERE uname='" + uname
					+ "' ";
			Statement stmt = conn.createStatement();
			ResultSet rsUname = stmt.executeQuery(sqlUname);

			if (rsUname.next()) {
				String sqlPwd = "SELECT passwd FROM t_user WHERE uname='"
						+ uname + "'";
				ResultSet rsPwd = stmt.executeQuery(sqlPwd);
				if (rsPwd.next()) {
					String uppwd = rsPwd.getString("passwd");
					if (uppwd.equals(pwd)) {
						System.out.println("登陆成功!");
					} else {
						System.out.println("登陆失败!");
					}
				}
				rsPwd.close();
			} else {
				System.out.println("用户名不存在!");
			}
			rsUname.close();
			
			stmt.close();
			conn.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值