JDBC SQL注入攻击的解决方案

--1,概述
		用来通过java程序 连接 数据库的技术
	--2,使用
		导入jar包(丰富的工具类)
		获取和数据库的连接(用户名、密码)
		通过程序执行SQL
		通过程序处理结果
	--3,向IDEA里导入jar包(丰富的工具类)
		--创建project:File-New-Project-选java-next-next-输入工程名-finish
		--创建lib目录:选中project-右键-new-directory-输入lib-回车
		--把jar包粘贴进lib里:cv大法
		--!!!编译jar包:
			File-Project Structure-选Libraries-点加号-找到jar包的位置-ok-选你要使用的位置-Apply-ok
		--检查:
			jar包前面有了小箭头,能展开源码就可以了	
	--4,入门案例
			package cn.tedu.jdbc;

			import java.sql.*;

			//测试 jdbc
			//需求:查询cgb2104库里的students表里的所有数据
			public class Test1 {
			    public static void main(String[] args) throws Exception {
			        //1,注册驱动
			        Class.forName("com.mysql.jdbc.Driver");
			        //2,获取和数据库的连接
			//String url= "jdbc:mysql://localhost:3306/cgb2104?characterEncoding=utf8";//指定要连接哪个数据库
			String url= "jdbc:mysql:///cgb2104?characterEncoding=utf8";//指定要连接哪个数据库
			        String user= "root" ; //使用的用户名
			        String pwd= "root" ; //使用的密码
			        Connection conn = DriverManager.getConnection(url, user, pwd);
			        //3,获取传输器,执行SQL
			        Statement st = conn.createStatement();
			        //4,执行SQL
			        ResultSet rs = st.executeQuery("select * from students");
			        //5,解析结果集
			        while( rs.next() ){//next()判断结果集中是否有数据
			            for (int i = 1; i <= 5 ; i++) {
			                //获取每列的值并打印
			                System.out.println( rs.getString(i) );
			            }
			        }
			        //6,释放资源
			        rs.close(); //关闭结果集
			        st.close();//关闭传输器
			        conn.close();//关闭连接
			    }
			}
	--5,SQL注入攻击的解决方案
			package cn.tedu.jdbc;

			import java.sql.*;
			import java.util.Scanner;

			//测试 jdbc
			/*总结:
			    作用: java程序和数据库连接的技术
			    SQL注入攻击问题:拼接SQL时,出现了特殊符号#,只需要输入用户名而不需要密码都可以登录
			    SQL注入攻击解决方案:不用Statement,换成了PreparedStatement,
			            新的工具类的好处:不用自己拼SQl的字符串了,安全,高效
			    PreparedStatement的解决过程:先把SQL骨架发给数据库,数据库进行预编译
			            等到设置好了参数,再和骨架一起执行,避免了人为的恶意的拼串造成的隐患
			 */
			public class Test2 {
			    public static void main(String[] args) {
			//        method();
			//        login();//SQL注入攻击问题
			        login2();//解决SQL注入攻击的方案
			    }
			    //解决SQL注入攻击的方案
			    private static void login2() {
			        try{
			            Class.forName("com.mysql.jdbc.Driver");
			            String url="jdbc:mysql:///cgb2104?characterEncoding=utf8";
			            Connection conn = DriverManager.getConnection(url, "root", "root");
			//            Statement st = conn.createStatement();不行,不安全,会被SQL攻击

			            String user = new Scanner(System.in).nextLine();//jack'#
			            String pwd = new Scanner(System.in).nextLine();
			            //?叫占位符 ,SQL的骨架
			    String sql ="select * from user2 where name=? and password=?";
			            //先把SQL骨架发给数据库执行
			            PreparedStatement ps = conn.prepareStatement(sql);
			            //给SQL里的? 设置参数
			            ps.setString(1,user);
			            ps.setString(2,pwd);
			            ResultSet rs = ps.executeQuery();//执行查询的SQL,返回结果集

			            if(rs.next()){
			                System.out.println("登录成功~");
			            }else{
			                System.out.println("登录失败~");
			            }
			            ps.close();
			            conn.close();
			        }catch(Exception e){
			            e.printStackTrace();//有异常,直接打印异常信息
			            //System.out.println("执行失败。。。");//上线
			        }
			    }

			    /*自己准备user2表(id/name/password),准备数据
			        CREATE TABLE `user2` (
			              `id` int(11)  PRIMARY KEY  auto_increment,
			              `name` varchar(10) default NULL,
			              `password` varchar(10) default NULL
			        ) ;
			     */
			    //需求:利用jdbc,根据用户名和密码查询cgb2104库里的user表
			    //SQL注入攻击问题
			    private static void login() {
			        try{
			            Class.forName("com.mysql.jdbc.Driver");
			            String url="jdbc:mysql:///cgb2104?characterEncoding=utf8";
			            Connection conn = DriverManager.getConnection(url, "root", "root");
			            Statement st = conn.createStatement();
			// String sql ="select * from user2 where name='jack' and password='123456'";//写死了

			            String user = new Scanner(System.in).nextLine();//jack'#
			            String pwd = new Scanner(System.in).nextLine();
			            //SQL注入攻击问题:本质上是因为SQL语句中出现了特殊符号#,改变了SQL语义
			 String sql ="select * from user2 where name='"+user+"' and password='"+pwd+"'";
			            ResultSet rs = st.executeQuery(sql);//执行查询的SQL,返回结果集
			            if(rs.next()){
			                System.out.println("登录成功~");
			            }else{
			                System.out.println("登录失败~");
			            }
			            st.close();
			            conn.close();
			        }catch(Exception e){
			            e.printStackTrace();//有异常,直接打印异常信息
			            //System.out.println("执行失败。。。");//上线
			        }

			    }
			    //需求:cgb2104库里的dept表里插入数据
			    private static void method() {
			        try{
			            Class.forName("com.mysql.jdbc.Driver");
			            String url="jdbc:mysql:///cgb2104?characterEncoding=utf8";
			            Connection conn = DriverManager.getConnection(url, "root", "root");
			            Statement st = conn.createStatement();

			//          ResultSet rs = st.executeQuery();//执行查询的SQL,返回结果集
			            //int rows = st.executeUpdate();//执行增删改的SQL,返回影响行数
			            int rows = st.executeUpdate("insert into dept values(null,'php开发部','北京')");
			            System.out.println(rows);//打印影响的行数

			            st.close();
			            conn.close();
			        }catch(Exception e){
			            e.printStackTrace();//有异常,直接打印异常信息
			            //System.out.println("执行失败。。。");//上线
			        }
			    }
			}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值