`
caleb_520
  • 浏览: 251941 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

如何防止SQL语句注入

 
阅读更多

为了给大家将SQL注入的原理,需要大家具备如下的知识:
(1)掌握基本Swing组件的开发
(2)掌握基本JDBC的开发

此课题的视频我们也为大家做好了。在文章的底部,大家可以看看。详细的SQL注入原理可以参考我们论坛的文章:http://forum.javait.org/viewthread.php?tid=53&extra=page%3D1

1、什么样的SQL语句是SQL注入语句

大家先看如下没有加入SQL注入设计的SQL语句

select * from student where sno = 's001'


根据上面的SQL语句,我们只需要改变一下就能够完成SQL语句的注入

select * from student where sno = 's001' or '1'='1'


2、在编写JDBC程序时候,如何利用上面SQL语句注入,完成输入不存在的学号也可以登录成功???

防止SQL注入的方法:利用JDBC的PreparedStatement来完成

3、代码实现
(1)编写界面窗口
package test;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

/**
 * 
 * @author JavaIT学习室
 *
 */
public class TestFrame extends JFrame {
	private JLabel sno; //学号
	private JTextField sno_t; //学号的文本框
	private JButton b; //登录按钮
	
	public TestFrame() {
		init(); //创建窗口的相关属性,例如:设置窗口的大小
	}
	
	private void init() {
		this.setTitle("防止SQL语句注入危险的程序"); //设置窗口标题
		this.setSize(300, 200); //设置窗口的高和宽
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置窗口的关闭方式
		this.setResizable(false); //设置窗口不可最大化,或是设置窗口不可调整大小
		
		//在放置基本组件的时候一定要注意窗口的布局方式
		this.setLayout(new FlowLayout()); //设置窗口是流式布局
		sno = new JLabel("学号:");
		sno_t = new JTextField(8);
		b = new JButton("登录");
		
		this.getContentPane().add(sno);
		this.getContentPane().add(sno_t);
		this.getContentPane().add(b);
		
		b.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				String s = sno_t.getText(); //返回窗口中输入的学号信息
				try {
					int i = DBUtil.getInstance().check_2(s);
					if (i > 0) {
						JOptionPane.showMessageDialog(null, "登录成功");
					} else {
						JOptionPane.showMessageDialog(null, "登录不成功");
					}
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} //将学号传入到数据库中进行匹配
			} //为按钮添加点击事情
			
		});
		
		this.setVisible(true); //设置窗口可以显示
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new TestFrame();
	}

}


(2)数据库代码
package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


/**
 * 数据库连接的类,利用JDBC技术完成
 * @author JavaIT学习室
 *
 */
public class DBUtil {
	private static final String USER_NAME = "sa";
	private static final String PASSWORD = "123456";
	private static final String driverclass = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
	private static final String url = "jdbc:sqlserver://localhost:1433;DatabaseName=stu";
	
	private static DBUtil db = null; //它是一个单例的对象
	
	private DBUtil() {
		try {
			Class.forName(driverclass); //加载驱动,必须将数据库的驱动包导入到工程中,不然会报错。sqljdbc.jar
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 返回主类DBConnectionUtil的对象,因为构造方法被定义为private,所以在初始化主类对象的时候只能用此方法实现
	 * @return
	 */
	public static DBUtil getInstance() {
		if (db == null) {
			db = new DBUtil();
		}
		return db;
	}
	
	/**
	 * 获取数据库连接Connection的对象
	 * @return
	 */
	public Connection getConnection() {
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(url, USER_NAME, PASSWORD);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	/**
	 * 关闭数据库连接对象的方法
	 * @param conn
	 */
	public void close(Connection conn) {
		try {
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 没有防止SQL注入的代码
	 * @return
	 * @throws SQLException 
	 */
	public int check(String sno) throws SQLException {
		String sql = "select count(sno) from student where sno = '"+sno+"'";
		System.out.println(sql);
		Statement stmt = DBUtil.getInstance().getConnection().createStatement();
		ResultSet rs = stmt.executeQuery(sql);
		if (rs != null && rs.next()) { //对执行的SQL语句的结果集进行遍历
			if (rs.getInt(1) > 0) {
				return 1; //确认该学生在数据库中存在
			}
		}
		return 0;
	}
	
	/**
	 * PreparedStatement可以防止SQL注意的接口
	 * @param sno
	 * @return
	 * @throws SQLException
	 */
	public int check_2(String sno) throws SQLException {
		String sql = "select count(sno) from student where sno = ?";
		PreparedStatement ps = DBUtil.getInstance().getConnection().prepareStatement(sql);
		ps.setString(1, sno);
		ResultSet rs = ps.executeQuery();
		if (rs != null && rs.next()) { //对执行的SQL语句的结果集进行遍历
			if (rs.getInt(1) > 0) {
				return 1; //确认该学生在数据库中存在
			}
		}
		return 0;
	}
}
0
2
分享到:
评论

相关推荐

    XC7V2000T与TMS320C6678设计文件全解析:含原理图、PCB及验证可直接生产使用,XC7V2000T与TMS320C6678设计文件详解:原理图、PCB等全囊括,验证合格,投入生产准备就

    XC7V2000T与TMS320C6678设计文件全解析:含原理图、PCB及验证可直接生产使用,XC7V2000T与TMS320C6678设计文件详解:原理图、PCB等全囊括,验证合格,投入生产准备就绪,XC7V2000T+TMS320C6678设计文件,包含原理图,PCB等文件,已验证,可直接生产。 ,XC7V2000T; TMS320C6678; 原理图; PCB; 已验证; 可直接生产,XC7V2000T与TMS320C6678设计方案文件集,已验证PCB原理图,可直接投入生产

    高质量男女性别男女分类数据集340张(已划分训练集与验证集).zip

    高质量男女性别男女分类数据集340张(已划分训练集与验证集).zip 两类:男人、女人,多种分类算法直接用,已划分分好 【数据集展示】https://blog.csdn.net/DeepLearning_/article/details/127943096 【项目源码下载】https://download.csdn.net/download/DeepLearning_/87190601

    Carbon storage in China’s forest ecosystems estimation by different integrative methods.pdf

    Carbon storage in China’s forest ecosystems estimation by different integrative methods.pdf

    算法小白必读!C语言实现排序与查找:冒泡、快排、二分法全解析.pdf

    # 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!

    超强大微信小程序源码-内含几十款功能王者战力查询.zip

    测试了,各种报错,但是能用 这是一款特别强大的一款微信小程序源码,初步算了一下,该款小程序目前包含了几十个功能。 具体功能如以下: 游戏扫码登录; 王者战力查询; 改名生成(多种生成方式); 头像框制作(N款模板); 王者巅峰数据查询; 王者英雄数据查询; 王者荣耀赛事数据查询; 动态壁纸(自动采集的都是动态); 证件照制作生成; 搜题功能,内含强大数据; 图片伪原创制作生成; 在线翻译功能,支持多国语言翻译; 游戏改名制作生成; 微信小程序流量主收益图在线DIY制作生成; 另外还有外卖CPS卷功能收益;

    零基础必看!C语言变量与数据类型的10个致命误区解析.pdf

    # 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!

    IMserver11111

    IM

    5个提升DeepSeekAPI生成质量的调参技巧,开发者必看!.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    51开发板基础实验源程序

    28个51开发板基础实验源程序。从点亮第一个LED实验到触摸屏实验。

    deepseek20个实用提示词

    deepseek20个实用提示词,人手必备。

    多模态应用开发:DeepSeekAPI处理图像、视频数据的3个创新案例.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    成本直降50%!DeepSeekAPI调用频次与费用优化策略.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    WPS深度集成案例:用DeepSeekAPI打造智能办公插件的完整开发实录.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    边缘计算场景:DeepSeek模型轻量化与端侧部署方案.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    三天造轮子:从零实现C语言版贪吃蛇.pdf

    # 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!

    auto_gptq-0.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

    auto_gptq-0.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

    工程技术承包合同[示范文本].doc

    工程技术承包合同[示范文本].doc

    结构体 struct关键字用来定义结构体

    结构体 struct关键字用来定义结构体

    LM1010 软件,KingstVIS

    LM1010 软件,KingstVIS

    elasticsearch在windows上的配置

    elasticsearch在windows上的配置

Global site tag (gtag.js) - Google Analytics