为了给大家将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;
}
}
分享到:
相关推荐
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注入的能力,只要使用它的setString方法传值即可:
一:丢弃SQL语句直接拼接,虽然这个写起来很快很方便。 二:如果用SQL语句,那就使用参数化,添加Param 三:尽可能的使用存储过程,安全性能高而且处理速度也快 四:屏蔽SQL,javascript等注入(很是主要的)...
万能SQL注入工具 本工具是用来进行SQL注入猜解的工具,主要针对一些没有错误返回信息的网站的表结构猜解(当然,如果有错误返回这个工具也适用,只是没必要使用这个工具了,因为有更好更快捷的工具),尤其是Java+...
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。下面这篇文章主要给大家介绍了关于Python中防止sql注入的...
sql注入总结 语句精简 类型丰富 种类齐全 值得学习 欢迎借鉴
手工注入常用SQL语句
手工sql注入的一些常用语句,适合初学的时候看
SQL2005 注入语句 SQL2005 注入语句 SQL2005 注入语句 SQL2005 注入语句 SQL2005 注入语句
动态拼接sql语句工具类,拼接where后面语句 配合原生jdbc仿动态sql注入 if (ObjectUtil.isNotEmpty(maxLat)&&ObjectUtil.isNotEmpty(minLat)){ sqlParamList.add(new SqlParam("lat",minLat, SqlOpEnum.GE)); ...
应用实例工具:c# 和access演示的。此方法在一定程度上防止sql的注入, 防止'or'='or' 'or''=' 'or ''=' " or "a"="a 此类sql语句在客户端注入
具体来说,它是利用现有应用程序,将恶意的sql命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入恶意的sql语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行sql语句。
SQL注入语句实例演示和解释,讲解具体怎样用注入语句,不同的情况用不现的注入方法。。。。。。。
经典的SQL注入语句,里面有的有注释啊,可以参考使用
Python连接Mysql库文件, 1、防止SQL注入, 2、用数组编写SQL, 3、防止误删数据和误更新数据 4、支持千万级QPS
安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入方法,命令安全测试-常见sql注入...
基本的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 ...