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

目录
  • 一,SQL注入
    • –1,需求
    • –2,测试
    • –3,总结
  • 二,练习PreparedStatement
    • –1,需求
    • –2,测试
    • –3,制作工具类
  • 三,HTML
    • –1,概述
    • –2,入门案例
    • –3,使用工具
    • –4,测试
  • 四,测试常用标签

一,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,概述

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

–2,入门案例

html>
	<head>
		<title>hello html~</title>
	</head>
	<body>
		test......
	</body>
</html>

–3,使用工具

<!DOCTYPE html> <!-- 声明这是一个HTML文件 -->
<html>  <!-- HTML根标签-->
	<head> <!-- 头部信息,设置网页的标题,编码。。。-->
		<meta charset="utf-8"> <!-- 设置网页的编码 -->
		<title> html测试 </title> <!-- 设置网页的标题 -->
	</head>
	<body> <!-- 体信息,设置网页中要显示的内容 -->
		<!-- 这是HTML的注释,Hbuilder复制粘贴一行ctrl c/ctrl v  ,剪切ctrl x,调整位置ctrl ↑↓ -->
		你好      html~
		你好html~ <br/>  <!-- br可以在网页中实现换行-->
		你&nbsp; &nbsp; &nbsp; &nbsp;好html~  <!-- &nbsp;可以在网页中实现空格-->
		你好html~
		你好html~
		你好html~
	</body>
</html>

–4,测试

四,测试常用标签

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>常用标签</title>
	</head>
	<body>
		<!-- 1. 标题标签 h1 h2 h3...h6 -->
			<h1> 1级标签 </h1>
			<h2> 2级标签 </h2>
			<h3> 3级标签 </h3>
			<h4> 4级标签 </h4>
			<h5> 5级标签 </h5>
			<h6> 6级标签 </h6>
		<!-- 2. 列表标签, ul+li无序列表   ol+li有序列表 -->
			<ol>
				<li> 全国新冠疫苗接种剂次超13亿 </li>
				<li> 刘伯明神七出舱曾遇险情 </li>
				<li> 中国成功发射风云三号05星 </li>
				<li> 江苏女生中考757分8门满分 </li>
			</ol>
		<!-- 3. 图片标签,在网页中插入一个图片
				src属性用来指定图片的路径
				width属性用来指定图片的宽度,单位是像素px
				height属性用来指定图片的高度,单位是像素px
		-->
			<img src="a/2.jpg" width="200px" height="500px"/>
			<img src="2.jpg" width="200px" height="500px"/>
			<img src="2.jpg" width="200px" height="500px"/>
		<!-- 4. 超链接标签
			href属性用来指定点击时要跳转的路径
			target属性用来指定是否打开新窗口
		-->
			<a href="http://www.baidu.com" target="_blank">点我</a>
		<!-- 锚定,返回顶部-->
			<a name="top">北京市富婆通讯录</a>
				<h1>18518518515</h1>
				<h1>123</h1>
				<h1>123</h1>
				<h1>123</h1>
				<h1>123</h1>
				<h1>123</h1>
				<h1>123</h1>
				<h1>123</h1>
				<h1>123</h1>
				<h1>123</h1>
				<h1>123</h1>
			<!-- href指定要回到的位置,通过#获取上面name的值 -->
			<a href="#top">点我,回到顶部</a>
		<!-- 5. input标签 	 -->
		<br />
			<input type="text" />  <!-- 普通文本类型-->
			<input type="number" />  <!-- 数字类型-->
			<input type="password" />  <!-- 密码,自动加密-->
			<input type="date" />  <!-- 年月日-->
			<input type="week" /> <!-- 周-->
			<input type="radio" />男  <!-- 单选框-->
			<input type="checkbox" />杨幂  <!-- 多选框-->
			<input type="button" value="点我"/>  <!-- 按钮 -->
			<input type="submit" />   <!-- 提交按钮 -->

			<br /><br /><br /><br /><br /><br />
	</body>
</html>

总结

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

(0)

相关推荐

  • 分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html

    下面给大家分享了一段php代码,讲解将360浏览器导出的favdb的sqlite数据库文件转换为html,下面代码简单易懂,感兴趣的朋友看一下吧. php代码如下所示: <?php $book_mark_name = 'book_mark.html'; $content = file_get_contents('tb_fav.json'); var_dump($content); $content_list = json_decode($content,'utf-8'); $content_li

  • js+html5操作sqlite数据库的方法

    本文实例讲述了js+html5操作sqlite数据库的方法.分享给大家供大家参考,具体如下: //copyright by lanxyou lanxyou[at]gmail.com var lanxDB=function(dbname){ var db=openDatabase(dbname,'1.0.0','',65536); return{ //返回数据库名 getDBName:function(){ return dbname; }, //初始化数据库,如果需要则创建表 init:func

  • PHP HTML JavaScript MySQL代码如何互相传值的方法分享

    1.PHP a.PHP -> HTML & JavaScript 额 超简单,我也要写= =- html代码中 <input type="" readonly="readonly" style='background-color:#DCDCDC' value=<?php echo $perinfo[ID];?> /> JavaScript代码中 复制代码 代码如下: <script type="text/java

  • Sql Server 如何去掉内容里面的Html标签

    分享一个方法,去掉内容里的Html标签,测试数据: DECLARE @str NVARCHAR(max)=' <!DOCTYPE html> <html> <head> </head> <body> <div>哈哈哈</div> </body> </html> ' 方法如下: CREATE FUNCTION [dbo].[removehtml] (@str NVARCHAR(MAX)) RETURN

  • tinyMCE插件开发之插入html,php,sql,js代码 并代码高亮显示

    下面就是我开发的过程. 首先,我的 tinyMCE版本是 Version: 3.2.7 (2009-09-22) .下载地址 http://www.jb51.net/codes/17198.htmltinyMCE插入代码,需要调用 tinyMCE的 tinyMCE.execCommand('mceInsertContent',false,value); 方法.其中参数无需改变,value 就是你要插入的内容, 比如我写了一个函数, 复制代码 代码如下: function InsertHTML(v

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

    目录 一,SQL注入 –1,需求 –2,测试 –3,总结 二,练习PreparedStatement –1,需求 –2,测试 –3,制作工具类 三,HTML –1,概述 –2,入门案例 –3,使用工具 –4,测试 四,测试常用标签 一,SQL注入 –1,需求 –1,利用jdbc查询user的信息,如果信息正确就登录,否则提示错误 –1,创建user表,指定字段id name password,并添加数据 –2,通过jdbc查询user表的数据,根据用户名和密码查 –2,测试 package cn

  • 实例介绍SQL注入以及如何解决

    前言 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息. 1.SQL注入案例 模拟一个用户登录的SQL注入案例,用户在控制台上输入用户名和密码, 然后使用 Statement 字符串拼接的方式实现用户的登录. 1.1 数据库中先创建用户表及数据 -- 创建一张用户表 CREATE TA

  • MyBatis下SQL注入攻击的3种方式

    目录 前言 Mybatis框架下易产生SQL注入漏洞的情况主要分为以下三种: 1.模糊查询 2.in 之后的多个参数 3.order by 之后 二.实战思路 三.总结 前言 SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少.新手代码审计者往往对Java Web应用的多个框架组合而心生畏惧,不知如何下手,希望通过Mybatis框架使用不当导致的SQL注入问题为例,能够抛砖引玉给新手一些思路. Mybatis的SQL语句可以基于注解的

  • 一文搞懂Java JDBC中的SQL注入问题

    目录 SQL注入 什么是SQL注入 SQL注入的效果的演示 SQL注入代码 SQL注入效果 如何避免SQL注入 PrepareStatement解决SQL注入 PreparedStatement的应用 参数标记 动态参数绑定 综合案例 PreparedStatement总结 必须使用Statement的情况 SQL注入 什么是SQL注入 在用户输入的数据中有SQL关键字或语法,并且关键字或语法参与了SQL语句的编译.导致SQL语句编译后的条件为true,一直得到正确的结果.这种现象就是SQL注入

  • Sql注入原理简介_动力节点Java学院整理

    一.什么是sql注入呢? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击.如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入. 黑客通过SQL注入攻击可以拿到网站数据库的访问

  • sql注入之必备的基础知识

    什么是SQL注入(SQL Injection) 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击. mysql常用注释 # --[空格]或者是--+ /*-*/ 在注意过程中,这些注释可能都需要进行urlencode. mysql认证绕过 ;%00 ' or 1=1 # ' /*!or */

  • java 过滤器filter防sql注入的实现代码

    实例如下: XSSFilter.java public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) throws IOException, ServletException { //flag = true 只做URL验证; flag = false 做所有字段的验证; boolean flag = true; if(flag){ //只

  • java持久层框架mybatis防止sql注入的方法

    sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如"or '1'='1'"这样的语句,有可能入侵参数校验不足的应用程序.所以在我们的应用中需要做一些工作,来防备这样的攻击方式.在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式. mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手

  • 避免sql注入_动力节点Java学院整理

    1.普通用户与系统管理员用户的权限要有严格的区分. 如果一个普通用户在使用查询语句中嵌入另一个Drop Table语句,那么是否允许执行呢?由于Drop语句关系到数据库的基本对象,故要操作这个语句用户必须有相关的权限.在权限设计中,对于终端用户,即应用软件的使用者,没有必要给他们数据库对象的建立.删除等权限.那么即使在他们使用SQL语句中带有嵌入式的恶意代码,由于其用户权限的限制,这些代码也将无法被执行.故应用程序在设计的时候,最好把系统管理员的用户与普通用户区分开来.如此可以最大限度的减少注入

  • Java面试题解析之判断以及防止SQL注入

    本文研究的主要是Java面试题中的一个比较常见的题目,判断及防止SQL注入的问题,具体介绍如下. SQL注入是目前黑客最常用的攻击手段,它的原理是利用数据库对特殊标识符的解析强行从页面向后台传入.改变SQL语句结构,达到扩展权限.创建高等级用户.强行修改用户资料等等操作. 那怎么判断是否被SQL注入了呢? 通过SQL注入的原理我们知道,判断SQL注入可以通过页面传入的数据,后台不应该相信从后台传入的任何数据特别是特殊整型参数和特殊字符参数! 防止SQL注入其实也很简单 1.检查变量数据类型和格式

随机推荐