`
caleb_520
  • 浏览: 247028 次
  • 性别: 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
分享到:
评论

相关推荐

    防止SQL语句注入

    NULL 博文链接:https://walleyekneel.iteye.com/blog/839713

    sql注入语句sql注入语句sql注入语句

    sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句...

    SQL注入语句,防止sql注入语句

    SQL注入语句,防止sql注入语句,验证sql注入

    常用Sql注入语句 常用Sql注入语句

    常用Sql注入语句 常用Sql注入语句 常用Sql注入语句

    防止sql注入解决方案

    防止sql注入引起的网络安全的解决措施采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可:

    C#防SQL注入代码的三种方法

     一:丢弃SQL语句直接拼接,虽然这个写起来很快很方便。  二:如果用SQL语句,那就使用参数化,添加Param  三:尽可能的使用存储过程,安全性能高而且处理速度也快  四:屏蔽SQL,javascript等注入(很是主要的)...

    SQL语句 注入猜解hack工具

    万能SQL注入工具 本工具是用来进行SQL注入猜解的工具,主要针对一些没有错误返回信息的网站的表结构猜解(当然,如果有错误返回这个工具也适用,只是没必要使用这个工具了,因为有更好更快捷的工具),尤其是Java+...

    Python中防止sql注入的方法详解

    SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。下面这篇文章主要给大家介绍了关于Python中防止sql注入的...

    sql注入攻击常用语句总结

    sql注入总结 语句精简 类型丰富 种类齐全 值得学习 欢迎借鉴

    手工注入常用SQL语句.txt

    手工注入常用SQL语句

    手工SQL注入常用SQL语句

    手工sql注入的一些常用语句,适合初学的时候看

    SQL2005注入语句

    SQL2005 注入语句 SQL2005 注入语句 SQL2005 注入语句 SQL2005 注入语句 SQL2005 注入语句

    动态拼接sql语句工具类,拼接where后面语句

    动态拼接sql语句工具类,拼接where后面语句 配合原生jdbc仿动态sql注入 if (ObjectUtil.isNotEmpty(maxLat)&&ObjectUtil.isNotEmpty(minLat)){ sqlParamList.add(new SqlParam("lat",minLat, SqlOpEnum.GE)); ...

    防止sql注入小方法

    应用实例工具:c# 和access演示的。此方法在一定程度上防止sql的注入, 防止'or'='or' 'or''=' 'or ''=' " or "a"="a 此类sql语句在客户端注入

    使用PHP实现防止sql注入功能

    具体来说,它是利用现有应用程序,将恶意的sql命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入恶意的sql语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行sql语句。

    SQL注入语句实例演示和解释.rar

    SQL注入语句实例演示和解释,讲解具体怎样用注入语句,不同的情况用不现的注入方法。。。。。。。

    SQL注入语句

    经典的SQL注入语句,里面有的有注释啊,可以参考使用

    最好用的Python连接Mysql库文件,防止SQL注入,可用数组编写SQL

    Python连接Mysql库文件, 1、防止SQL注入, 2、用数组编写SQL, 3、防止误删数据和误更新数据 4、支持千万级QPS

    安全测试-常见sql注入方法,命令

    安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入...

    sql注入语句.txt

    基本的sql注入语法,大部分存在sql注入都可以使用以上代码来尝试 查询表名 and 1=2 union select 1,table一name from information—scherna.tables where table_schema=database() limit 1,1 and 1=2 union select ...

Global site tag (gtag.js) - Google Analytics