先看一个例子
public static void main(String[] args) {
//查询相应学号的学生信息
String ID="";
Scanner input=new Scanner(System.in);
System.out.println("请输入您的学号");
if(input.hasNextLine()) {
ID=input.nextLine();
}
String sql="select * from student where ID='"+ID+"'";
ResultSet rs=resultSet.getResultSet(sql);
System.out.print("学号\t");
System.out.print("姓名\t");
System.out.print("专业\t");
System.out.println("总学分");
try {
while(rs.next()) {
System.out.print(rs.getString("ID")+"\t");
System.out.print(rs.getString("name")+"\t");
System.out.print(rs.getString("dept_name")+"\t");
System.out.println(rs.getInt("tot_cred"));
}
}catch(SQLException e) {
System.err.println("查询出错!!"+e.getStackTrace());
}
}
先看正常的输入

执行结果:

再看异常输入

执行结果:

可见,这样输入之后,可以查询到所有的学生信息,如果是银行或者国家政府结构的话,是非常危险的
- 为什么会这样呢?
- 我输入的是 1’ or 1=1 –
- 这样sql语句为:select * from student where id=’1’ or 1=1 –’
- 有效的部分:select * from student where id=’1’ or 1=1,因为–把后面的注释掉了
- 看一下where后面的部分:id=’1’ or 1=1,是一个永真式
- 进而sql语句等价为:select * from student
- 多么可怕!!!
解决办法
使用占位符
public static void main(String[] args) {
//查询相应学号的学生信息
String ID="";
Scanner input=new Scanner(System.in);
System.out.println("请输入您的学号");
if(input.hasNextLine()) {
ID=input.nextLine();
}
String sql="select * from student where ID=?";
PreparedStatement pstmt=preparedStatement.getPreparedStatement(sql);
System.out.print("学号\t");
System.out.print("姓名\t");
System.out.print("专业\t");
System.out.println("总学分");
try {
pstmt.setString(1, ID);
ResultSet rs=pstmt.executeQuery();
while(rs.next()) {
System.out.print(rs.getString("ID")+"\t");
System.out.print(rs.getString("name")+"\t");
System.out.print(rs.getString("dept_name")+"\t");
System.out.println(rs.getInt("tot_cred"));
}
}catch(SQLException e) {
System.err.println("查询出错!!"+e.getStackTrace());
}
}
正常输入:

执行结果:

异常输入:

执行结果:

本文通过一个学生信息查询的例子,展示了如何利用SQL注入攻击获取未授权的数据,并介绍了使用预编译语句(占位符)来有效防止此类安全威胁的方法。
6852

被折叠的 条评论
为什么被折叠?



