cgb2109-day07

Posted cgblpx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cgb2109-day07相关的知识,希望对你有一定的参考价值。

一,SQL攻击

–1,模拟SQL攻击的现象

//出现了问题:SQL攻击:
//1,本质上就是因为SQL中出现了特殊符号#,#号在SQL中是注释的意思(测试时使用固定的用户名jack’#)
//2,Statement传输器在执行SQL时遇到了SQL拼接,把#当做了注释用!!

package cn.tedu.jdbc;
import org.junit.Test;
import java.awt.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
//模拟用户登录
public class Test2 {
   
    //模拟用户登录,从单元测试改成main()原因是IDEA单元测试方法无法键盘输入
    public static void main(String[] args) throws Exception{
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,连接数据库
        String url="jdbc:mysql:///cgb2109?characterEncoding=utf8";
        Connection c = DriverManager.getConnection(url, "root", "root");
        //3,获取传输器
        Statement s = c.createStatement();
        //4,执行SQL
        System.out.println("请输入用户名:");
        String username = new Scanner(System.in).nextLine();
        System.out.println("请输入密码:");
        String password = new Scanner(System.in).nextLine();
        //拼接字符串: 一对儿双引号中间一对儿加号 再中间看你了 "+???+"
//        String sql="select * from user where name='jack' and pwd='123'";
        String sql="select * from user where name='"+username+"' and pwd='"+password+"'";
        ResultSet r = s.executeQuery(sql);
        //5,处理结果
        if( r.next() ){//判断有数据吗?如果有数据就可以登录
            System.out.println("登录成功!");
        }else{//没数据,重新输入或去注册
            System.out.println("登录失败,请重新输入或去注册!");
        }
        //6,释放资源
        r.close();
        s.close();
        c.close();
    }
}

–2,解决方案

package cn.tedu.jdbc;

import org.junit.Test;

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

//模拟用户登录
public class Test2 {
    //出现了问题:SQL攻击:
    //1,本质上就是因为SQL中出现了特殊符号#,#号在SQL中是注释的意思(测试时使用固定的用户名jack'#)
    //2,Statement传输器在执行SQL时遇到了SQL拼接,把#当做了注释用!!
    //模拟用户登录,从单元测试改成main()原因是IDEA单元测试方法无法键盘输入
    public static void main(String[] args) throws Exception{
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,连接数据库
        String url="jdbc:mysql:///cgb2109?characterEncoding=utf8";
        Connection c = DriverManager.getConnection(url, "root", "root");
        //3,获取传输器
//        Statement s = c.createStatement();//SQL攻击问题
        //4,执行SQL
        System.out.println("请输入用户名:");
        String username = new Scanner(System.in).nextLine();
        System.out.println("请输入密码:");
        String password = new Scanner(System.in).nextLine();
//        String sql="select * from user where name='"+username+"' and pwd='"+password+"'";
        //SQL骨架,?叫占位符
        String sql="select * from user where name=? and pwd=?";
        //准备执行预编译的SQL
        //PreparedStatement好处:SQL简单,安全(解决SQL攻击),高效
        PreparedStatement s = c.prepareStatement(sql);
        //设置SQL中的参数
        s.setObject(1,username);//给第1个?设置用户名
        s.setObject(2,password);//给第2个?设置用户名

        ResultSet r = s.executeQuery();
        //5,处理结果
        if( r.next() ){//判断有数据吗?如果有数据就可以登录
            System.out.println("登录成功!");
        }else{//没数据,重新输入或去注册
            System.out.println("登录失败,请重新输入或去注册!");
        }
        //6,释放资源
        r.close();
        s.close();
        c.close();
    }
}

–3,练习PreparedStatement

package cn.tedu.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

//需求:利用新的传输器,向dept表里插入数据
public class Test3 {
    public static void main(String[] args) throws Exception{
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取连接
        String url="jdbc:mysql://localhost:3306/cgb2109?characterEncoding=utf8";
        Connection c = DriverManager.getConnection(url, "root", "root");
        //3,传输器
        String sql ="insert into dept values(null,?,?)";//SQL骨架
        PreparedStatement p = c.prepareStatement(sql);
        //设置SQL中的参数--给第几个?设置啥值
        p.setObject(1,"php开发部");
        p.setObject(2,"北京");
        //4,执行SQL
        p.executeUpdate();//执行增删改的SQL,返回影响行数
        //5,处理结果
        //6,释放资源
        p.close();
        c.close();
    }
}

–4,扩展: 程序优化

JDBC的前两步,重复的写了很多次,优化这种现象来提高代码的复用性/高内聚.

1,创建工具类

1,提供工具类
2,提供方法(封装JDBC的前两步)

package cn.tedu.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;

//封装了注册驱动,获取连接.
//目的:获取连接,并返回给调用者
public class JDBCUtils {
    /**目的:获取连接,并返回给调用者 */
    static public Connection get() throws Exception{
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取连接
        String url="jdbc:mysql://localhost:3306/cgb2109?characterEncoding=utf8";
        Connection c = DriverManager.getConnection(url, "root", "root");
        return c; //返回给调用者
    }
}

2,改造测试类

3,调用类里的方法

package cn.tedu.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

//需求:利用新的传输器,向dept表里插入数据
public class Test3 {
    public static void main(String[] args) throws Exception{
        //TODO  利用工具类里封装好的方法
        Connection c = JDBCUtils.get();
        //3,传输器
        String sql ="insert into dept values(null,?,?)";//SQL骨架
        PreparedStatement p = c.prepareStatement(sql);
        //设置SQL中的参数--给第几个?设置啥值
        p.setObject(1,"php开发部");
        p.setObject(2,"北京");
        //4,执行SQL
        p.executeUpdate();//执行增删改的SQL,返回影响行数
        //5,处理结果
        //6,释放资源
        c.close();
        p.close();
    }
}

3,总结

二,标题

三,标题

以上是关于cgb2109-day07的主要内容,如果未能解决你的问题,请参考以下文章

cgb2109-day04

cgb2109-day06

cgb2109-day17

cgb2109-day16

cgb2109-day03

cgb2109-day11