当前位置:Gxlcms > 数据库问题 > sql注入漏洞

sql注入漏洞

时间:2021-07-01 10:21:17 帮助过:5人阅读



//处理界面
package com.xidian;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;

public class Logincl extends HttpServlet {

public void doGet(HttpServletRequest req,HttpServletResponse res){
Connection ct=null;
Statement sm=null;
ResultSet rs=null;

try{
   //接收用户名和密码
    String u=req.getParameter("username");
    String p=req.getParameter("password");
   //连接数据库
   Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
   //得到连接
   ct=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test","sa","dba");
   //创建Statement
   sm=ct.createStatement();
   //sql注入漏洞
   rs=sm.executeQuery("select top 1* from users where username= ‘"+u+"‘and passwd=‘"+p+"‘");
  //验证
  if(rs.next()){
  //合法
  //将验证成功的信息,写入session
  //1.得到session
  HttpSession hs=req.getSession(true);
  //修改session的存在时间
  hs.setMaxInactiveInterval(10);
   //2.向session添加属性
  hs.setAttribute("pass","ok");
  res.sendRedirect("Welcome?uname="+u+"&upass="+p);

}else{
//不合法
res.sendRedirect("login");//要到的servlet的那个url
  }
}
catch(Exception ex){ ex.printStackTrace(); }finally{ try { if(rs!=null){ rs.close(); } if(rs!=null){ sm.close(); } if(rs!=null){ ct.close(); } } catch (Exception ex) { ex.printStackTrace(); } } } public void doPost(HttpServletRequest req,HttpServletResponse res){ this.doGet(req,res); } }

如果在sqlserver输入命令:select * from users where username=‘任意字符‘ and passwd=‘任意字符‘ or 1=‘1‘
都能查找出结果,因为or 1=‘1‘语句使得条件都成立。
如果用户在输入密码:任意字符‘ or 1=‘1 都能通过验证。

修改后代码:

rs=sm.executeQuery("select top 1 passwd from users where username= ‘"+u+"‘");
if(rs.next()){
//说明用户名是存在
String dbPasswd=rs.getString(1);
if(dbPasswd.equals(p)){
//用户合法
HttpSession hs=req.getSession(true);
//修改session的存在时间
hs.setMaxInactiveInterval(10);
//2.向session添加属性
hs.setAttribute("pass","ok");
res.sendRedirect("Welcome?uname="+u+"&upass="+p);
  }
}

不要在sm.executeQuery()中同时查询用户名和密码来验证以带来注入风险,应该通过输入的用户名在数据库中查找密码,
然后将数据库中对应的用户密码与用户输入的密码进行比对。

 

sql注入漏洞

标签:

人气教程排行