Java SQL注入案例教程及html基础入门

一,SQL注入

–1,需求

–1,利用jdbc查询user的信息,如果信息正确就登录,否则提示错误

–1,创建user表,指定字段id name password,并添加数据

–2,通过jdbc查询user表的数据,根据用户名和密码查

–2,测试

package cn.tedu.test;
import java.sql.*;
import java.util.Scanner;
//测试 用户的查询
/*
create table user(
	id int primary key auto_increment,
	name varchar(20),
	password varchar(20)
)
insert into user values(null,'jack','123');
insert into user values(null,'rose','123');
 */
public class Test3 {
    public static void main(String[] args) throws Exception {
//       method();  //模拟登录
//       method2(); //暴露问题
       method3(); //解决SQL攻击问题
    }
    private static void method3() throws Exception {
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取连接
        String url ="jdbc:mysql:///cgb2105?characterEncoding=utf8" ;//简写形式
        Connection  conn = DriverManager.getConnection(url, "root", "root");
        //3,获取传输器
//        Statement st = conn.createStatement();
//        String sql = "select * from user where name='"+a+"' and password='"+b+"'";
        String a = new Scanner(System.in).nextLine();//用户名
        String b = new Scanner(System.in).nextLine();//密码
        //SQL骨架,?叫占位符
        String sql = "select * from user where name=? and password=?";
        //PreparedStatement把SQL骨架和参数分开发送给数据的
        //解决了SQL攻击问题:jack'# 只是把#当做普通文本而不是注释符号
        PreparedStatement ps = conn.prepareStatement(sql);
        //给SQL设置参数--指定要给哪个问号赋啥值
        ps.setString(1,a);
        ps.setString(2,b);
        //4,执行SQL,根据用户名和密码查库
        ResultSet rs = ps.executeQuery();
        //5,解析结果集
        if( rs.next() ){ //如果查到了数据next()返回true,就可以登录
            System.out.println("登录成功~~");
        }else{
            System.out.println("登录失败!");
        }
        //6,释放资源
        rs.close();//释放结果集
        ps.close();//释放传输器
        conn.close();//释放连接
    }
    private static void method2() throws Exception {
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取连接
        String url ="jdbc:mysql:///cgb2105?characterEncoding=utf8" ;//简写形式
        Connection  conn = DriverManager.getConnection(url, "root", "root");
        //3,获取传输器
        Statement st = conn.createStatement();
        //4,执行SQL,根据用户名和密码查库
        String a = new Scanner(System.in).nextLine();//用户名
        String b = new Scanner(System.in).nextLine();//密码
//SQl攻击/SQL注入问题:本质是因为用户输入的特殊符号造成SQL语义发生了改变。jack'#
        String sql = "select * from user where name='"+a+"' and password='"+b+"'";
        ResultSet rs = st.executeQuery(sql);
        //5,解析结果集
        if( rs.next() ){ //如果查到了数据next()返回true,就可以登录
            System.out.println("登录成功~~");
        }else{
            System.out.println("登录失败!");
        }
        //6,释放资源
        rs.close();//释放结果集
        st.close();//释放传输器
        conn.close();//释放连接
    }
    //模拟登录:根据用户名和密码查询user表
    private static void method() throws Exception {
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取连接
//String url ="jdbc:mysql://localhost:3306/cgb2105?characterEncoding=utf8" ;
String url ="jdbc:mysql:///cgb2105?characterEncoding=utf8" ;//简写形式
        Connection  conn = DriverManager.getConnection(url, "root", "root");
        //3,获取传输器
        Statement st = conn.createStatement();
        //4,执行SQL,根据用户名和密码查库
        String sql = "select * from user where name='jack' and password='123'";
        ResultSet rs = st.executeQuery(sql);
        //5,解析结果集
        if( rs.next() ){ //如果查到了数据next()返回true,就可以登录
            System.out.println("登录成功~~");
        }else{
            System.out.println("登录失败!");
        }
        //6,释放资源
        rs.close();//释放结果集
        st.close();//释放传输器
        conn.close();//释放连接
    }
}

–3,总结

SQL 攻击发生的现象是:用户输入了一些SQL中的特殊字符,#表示注释

Statement工具:无法避免SQL注入问题,而且SQL复杂需要自己拼接参数,低效

PreparedStatement工具:避免了SQL攻击的问题,SQL简单,高效

–SQL简单,先把SQL骨架发给数据库,再把参数发给数据库。用?代替参数的位置叫占位符

二,练习PreparedStatement

–1,需求

删除id=1的用户信息

–2,测试

package cn.tedu.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Test4 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps= null;
        try{
            //调用工具类,,,获取连接
            conn = JDBCUtils.getConnection();
            //3,获取传输器 ,利用高级的工具类执行SQL
            //先执行SQL骨架
            String sql = "delete from user where id=?";
            ps = conn.prepareStatement(sql);
            //给第一个问号,设置值是1
            ps.setInt(1,1);
            //4,执行SQL
            int rows = ps.executeUpdate();
            System.out.println("删除成功");
        }catch (Exception e){
            System.out.println("执行失败...");
        }finally{ //最终一定会被执行的
            //5,释放资源
           JDBCUtils.close(null,ps,conn);
        }
    }
}

–3,制作工具类

package cn.tedu.test;
import java.sql.*;
//提取jdbc重复的代码,提高复用性
public class JDBCUtils {
    /**
     * 释放资源
     * @param rs 结果集
     * @param ps 传输器
     * @param conn 数据库的连接
     */
    final static public void close(ResultSet rs, PreparedStatement ps, Connection conn){
        if(rs != null){//防止空指针异常
            try {
                rs.close();
            } catch (SQLException throwables) {
                System.out.println("执行失败...");//项目上线后的
                //throwables.printStackTrace();//程序调试阶段
            }
        }
        if(ps != null){//防止空指针异常
            try {
                ps.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(conn != null) {//防止空指针异常
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
    /**
     * 获取和数据库的连接
     * */
    static public Connection getConnection() throws Exception {
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取连接
        String url="jdbc:mysql:///cgb2105?characterEncoding=utf8";
        Connection conn = DriverManager.getConnection(url,"root","root");
        return conn;
    }
}

三,HTML

–1,概述

是超文本标记语言,是指可以在网页中加入比文本更丰富的内容。标记有很多,要写开始标记和结果标记

–2,入门案例

html>
	
		hello html~
	
	
		test......
	

–3,使用工具

Java SQL注入案例教程及html基础入门_第1张图片

Java SQL注入案例教程及html基础入门_第2张图片

Java SQL注入案例教程及html基础入门_第3张图片

Java SQL注入案例教程及html基础入门_第4张图片

 
  
	 
		 
		 html测试  
	
	 
		
		你好      html~
		你好html~ 
你       好html~ 你好html~ 你好html~ 你好html~

–4,测试

Java SQL注入案例教程及html基础入门_第5张图片

四,测试常用标签



	
		
		常用标签
	
	
		
			

1级标签

2级标签

3级标签

4级标签

5级标签
6级标签
  1. 全国新冠疫苗接种剂次超13亿
  2. 刘伯明神七出舱曾遇险情
  3. 中国成功发射风云三号05星
  4. 江苏女生中考757分8门满分
点我 北京市富婆通讯录

18518518515

123

123

123

123

123

123

123

123

123

123

点我,回到顶部
杨幂





总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

你可能感兴趣的:(Java SQL注入案例教程及html基础入门)