为了给大家将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;
}
}
分享到:
相关推荐
XC7V2000T与TMS320C6678设计文件全解析:含原理图、PCB及验证可直接生产使用,XC7V2000T与TMS320C6678设计文件详解:原理图、PCB等全囊括,验证合格,投入生产准备就绪,XC7V2000T+TMS320C6678设计文件,包含原理图,PCB等文件,已验证,可直接生产。 ,XC7V2000T; TMS320C6678; 原理图; PCB; 已验证; 可直接生产,XC7V2000T与TMS320C6678设计方案文件集,已验证PCB原理图,可直接投入生产
高质量男女性别男女分类数据集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
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
测试了,各种报错,但是能用 这是一款特别强大的一款微信小程序源码,初步算了一下,该款小程序目前包含了几十个功能。 具体功能如以下: 游戏扫码登录; 王者战力查询; 改名生成(多种生成方式); 头像框制作(N款模板); 王者巅峰数据查询; 王者英雄数据查询; 王者荣耀赛事数据查询; 动态壁纸(自动采集的都是动态); 证件照制作生成; 搜题功能,内含强大数据; 图片伪原创制作生成; 在线翻译功能,支持多国语言翻译; 游戏改名制作生成; 微信小程序流量主收益图在线DIY制作生成; 另外还有外卖CPS卷功能收益;
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
IM
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
28个51开发板基础实验源程序。从点亮第一个LED实验到触摸屏实验。
deepseek20个实用提示词,人手必备。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
# 踏入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
工程技术承包合同[示范文本].doc
结构体 struct关键字用来定义结构体
LM1010 软件,KingstVIS
elasticsearch在windows上的配置