昨天编写了个网页登陆简单的实例,原本SQL语句为select * from info_test where name='n'and
pass='p'其中,name,pass 为数据库中的字段;但是这种构造方法不行,有注入漏洞,因此想到先从数据库中核对
name项,然后再比对密码项;
那么流程如下:
1、如果在库中检索不到n值,就输出“不存在该用户”;
2、如果匹配到n值,则继续匹配p值;
3、如果有p值就输出“正确登陆”;如果没有,则输出“密码错误”;
出现问题是:如果匹配到n值,但不管P值有没有,一概输出“密码错误”;请大家帮我看看!
----------------------------------------------------------------------
[color=orange]自行解决了问题:原因是数据库中的pass为char型,数据长度不够的时候,会自动加空格填平,这就导致了String读出密码,但是有空格的,所以出现了pw.equals(p)为false的情况;解决方法就是在
String pw=rs.getString(3);这一句上面加上.trim();去掉后面的空格;
即:String pw=rs.getString(3).trim();
好了,已经标好了颜色,请大家在编辑程序的时候注意一下!^0^ [/color]
---------------------------------------------------------------start
Connection conn=null;//初始化
Statement st=null; //初始化
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url="jdbc:sqlserver://localhost:1433; DatabaseName=data_test";
String user="sa";
String password="mima";
conn=DriverManager.getConnection(url, user, password);
System.out.println("^0^连接数据库成功!");
}catch (Exception e) {
System.out.println("- -连接数据库失败!");
System.out.println(e.getMessage());
}
String n=request.getParameter("name");//得到提交页的用户值;
String p=request.getParameter("pass");//得到提交页的密码值;
st=conn.createStatement();//创造执行实例
String StrSQL="select * from info_test where name='"+n+"'";
ResultSet rs=st.executeQuery(StrSQL);//执行SQL语句;
if(rs.next())
{//如果用户存在
[color=red]String pw=rs.getString(3);//将库中第3列的数据取出来,即取出库中密码;[/color]
out.println(pw); //在浏览器中输出密码;
if(pw.equals(p))//判断库中密码【pw】是否与提交页密码【p】相等;
{
out.println("正确登陆");//如果相等,则输出“正确登陆”;
st.close();//实例关闭;
conn.close();//数据库连接关闭;
out.println("数据库关闭成功!!");//输出“数据库关闭”;
}
else
{
out.println("密码错误");
st.close();
conn.close();
System.out.println("数据库关闭成功!!");
}
}
else
{
out.println("不存在该用户");
st.close();
conn.close();
System.out.println("数据库关闭成功!!");
}
---------------------------------end
1.如果用户名不正确,那么返回“不存在该用户”,没有问题;
2.如果用户名正确,密码不管正确与否,都返回“密码错误”!!
看来 pw.equals(p) 程序没有识别对,不知何解?
pass='p'其中,name,pass 为数据库中的字段;但是这种构造方法不行,有注入漏洞,因此想到先从数据库中核对
name项,然后再比对密码项;
那么流程如下:
1、如果在库中检索不到n值,就输出“不存在该用户”;
2、如果匹配到n值,则继续匹配p值;
3、如果有p值就输出“正确登陆”;如果没有,则输出“密码错误”;
出现问题是:如果匹配到n值,但不管P值有没有,一概输出“密码错误”;请大家帮我看看!
----------------------------------------------------------------------
[color=orange]自行解决了问题:原因是数据库中的pass为char型,数据长度不够的时候,会自动加空格填平,这就导致了String读出密码,但是有空格的,所以出现了pw.equals(p)为false的情况;解决方法就是在
String pw=rs.getString(3);这一句上面加上.trim();去掉后面的空格;
即:String pw=rs.getString(3).trim();
好了,已经标好了颜色,请大家在编辑程序的时候注意一下!^0^ [/color]
---------------------------------------------------------------start
Connection conn=null;//初始化
Statement st=null; //初始化
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url="jdbc:sqlserver://localhost:1433; DatabaseName=data_test";
String user="sa";
String password="mima";
conn=DriverManager.getConnection(url, user, password);
System.out.println("^0^连接数据库成功!");
}catch (Exception e) {
System.out.println("- -连接数据库失败!");
System.out.println(e.getMessage());
}
String n=request.getParameter("name");//得到提交页的用户值;
String p=request.getParameter("pass");//得到提交页的密码值;
st=conn.createStatement();//创造执行实例
String StrSQL="select * from info_test where name='"+n+"'";
ResultSet rs=st.executeQuery(StrSQL);//执行SQL语句;
if(rs.next())
{//如果用户存在
[color=red]String pw=rs.getString(3);//将库中第3列的数据取出来,即取出库中密码;[/color]
out.println(pw); //在浏览器中输出密码;
if(pw.equals(p))//判断库中密码【pw】是否与提交页密码【p】相等;
{
out.println("正确登陆");//如果相等,则输出“正确登陆”;
st.close();//实例关闭;
conn.close();//数据库连接关闭;
out.println("数据库关闭成功!!");//输出“数据库关闭”;
}
else
{
out.println("密码错误");
st.close();
conn.close();
System.out.println("数据库关闭成功!!");
}
}
else
{
out.println("不存在该用户");
st.close();
conn.close();
System.out.println("数据库关闭成功!!");
}
---------------------------------end
1.如果用户名不正确,那么返回“不存在该用户”,没有问题;
2.如果用户名正确,密码不管正确与否,都返回“密码错误”!!
看来 pw.equals(p) 程序没有识别对,不知何解?