标签:
数据库验证用户的功能
//处理界面
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()中同时查询用户名和密码来验证以带来注入风险,应该通过输入的用户名在数据库中查找密码,
然后将数据库中对应的用户密码与用户输入的密码进行比对。
标签:
原文地址:http://www.cnblogs.com/xiangkejin/p/5695965.html