预编译解决sql的注入攻击PrepareStatement

SQL注入攻击:
由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执行一些特殊的操作,这样的攻击方式就叫做sql注入攻击

1.登陆的数据库实现代码:

public User findUserByUserNameAndPassword(String username, String password) {
		try {
			<span style="color:#ff0000;">String sql="select * from users where username='"+username+"'and password='"+password+"'"</span>;
			con=JDBCUtils.getConnection();
			sta =con.createStatement();
			rs=sta.executeQuery(sql);
			if(rs.next()){
				User user=new User();
				user.setId(rs.getInt("id"));
				user.setUsername(rs.getString("username"));
				user.setNickname(rs.getString("nickname"));
				user.setEmail(rs.getString("email"));
				return user;
			}else{
				return null;
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException();
		}finally{
			JDBCUtils.closeResource(rs, sta, con);
		}
	}

2.登陆界面:我的数据库中已经添加了dd的用户名和密码为dd的密码用户,但是我在用户名输入框中填写dd'#的时候不输入密码也能登陆。这是什么原因呢?我们找到数据库中影响这个的代码:String sql="select * from users where username='"+username+"'and password='"+password+"'";如果加上'#:相当于把后面的注释掉了。因此只需要判断用户名正确就可以了!




3.为了解决这种攻击我们可以采用使用PrepareStatement

PreparedStatement利用预编译的机制将sql语句的主干和参数分别传输给数据库服务器,从而使数据库分辨的出哪些是sql语句的主干哪些是参数,这样一来即使参数中带了sql的关键字,数据库服务器也仅仅将他当作参数值使用,关键字不会起作用,从而从原理上防止了sql注入的问题.

PrepareStatement案例:

package cn.itheima.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import cn.itheima.utils.JDBCUtils;

public class JDBCDemo5 {
	public static void main(String[] args) {
		Connection con=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			con=JDBCUtils.getConnection();
			ps=con.prepareStatement("select * from user where name=? ");
			ps.setString(1, "韩玮");
			rs=ps.executeQuery();
			//1.查询了数据形成一个表
			//rs指向查询出的数据表的前一行
			if(rs.next()){
				String id = rs.getString("id");
				String name=rs.getString("name");
				String birthday=rs.getString("birthday");
				System.out.println(id+":"+name+":"+birthday);
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException();
		}finally{
			JDBCUtils.closeResource(rs, ps, con);
		}
		
	}
}
语句中的参数部分全部使用?然后使用ps.setXXX方法来设置参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值