sql注入漏洞的一种实例

本文探讨了在使用SQL查询语句时遇到的SQL注入漏洞,并提供了两种解决方法:一种是通过比较数据库返回的密码与用户输入的密码来验证用户身份;另一种是使用PreparedStatement进行参数化查询,避免直接拼接SQL语句。这些方法有效防止了SQL注入攻击,确保了系统的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在做毕业设计的时候,竟然碰到了一中叫sql注入漏洞的现象。

  当笔者用一条sql语句查询时,select * from users where username='zf' and passwd='zf' or 1='1'   竟然将所有的数据全都查了出来。

  检查用户合法性的代码如下:

//检查用户的合法性
	public boolean checkUser(String u,String p){
		boolean b=false;
		try {
			ConnDB db=new ConnDB();
			conn=db.getConn();
			String sql="select top 1 * from users where username='"+u+"' and passwd='"+p+"'";			
		        ps = conn.prepareStatement(sql);	
			ResultSet rs = ps.executeQuery();		
			if (rs.next()) {				
					b=true;								
			} 
		}catch (Exception e) {			
			e.printStackTrace();
		}finally{
			this.close();

		}
		return b;
	}

  这时候在登录界面随便输入一个用户名,然后密码输入select * from users where username='zf' and passwd=' zf' or 1='1' 中红色的部分即可(zf可以是任意字符,为空也可),就可以顺利的登入网站。是无论用什么用户名都可以。

  解决的办法就是通用输入的用户名去查询数据库,然后返回一个密码,用这个密码与用户输入的密码进行比较,这样就可以解决如上的sql注入漏洞的问题。

  String sql="select top 1  passwd  from users where username='"+u+"' ";

  ps = conn.prepareStatement(sql);

  ResultSet rs = ps.executeQuery();
if (rs.next()) {
String passwd=rs.getString(3);
if(passwd.equals(p)){
b=true;
}

  还有一种办法就是用ps.setXXX()的方式。

  

	//检查用户的合法性
	public boolean checkUser(String u,String p){
		boolean b=false;
		try {
			ConnDB db=new ConnDB();
			conn=db.getConn();			
			String sql="select top 1 * from users where username=? and passwd=?";
			ps = conn.prepareStatement(sql);	
			ps.setString(1, u);
			ps.setString(2, p);
			ResultSet rs = ps.executeQuery();		
			if (rs.next()) {				
				b=true;							
			} 
		}catch (Exception e) {			
			e.printStackTrace();
		}finally{
			this.close();

		}
		return b;
	}

  这两种方式都可以解决这种sql注入漏洞的。当然第一种方法是通用的,而第二种只能针对jsp语言的。

  如有不足之处欢迎提出。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员一点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值