在JSP基本登录模块Ⅳ中,如果在密码栏输入“'or'1'='1”,我们发现不知道密码也可以登录成功。
这是因为当我们的密码为“'or'1'='1”时,SQL语句变为:
Select*FROM member Where username='magci'and password=''or'1'='1''1'='1'是永真的,这条SQL语句是能通过验证的。
这就是SQL注入攻击。
为了防止SQL注入攻击,可以使用PraparedStatement对象操作数据库。
改进后的登录模块如下:
附加功能:防止SQL注入攻击
登录模块至少需要以下几个页面:1.检查Cookie页面(index.jsp);2.输入用户信息页面(login.jsp);3.用户合法性验证页面(check.jsp);4.登录成功欢迎页面(pass.jsp)(检查Session设置);5.登录失败提示页面(failure.jsp);6.注销登录页面(logout.jsp)。
数据库:member.mdb
结构图:---------------------------------------------------------------------index.jsp||判断Cookie中有无用户名、密码----------------------|Y N||V|login.jspcheck.jsp||查询用户名、密码|V|member.mdb||返回结果|V|check.jsp||判断用户是否合法|---------------------||Y N||V V|pass.jsp failure.jsp------->||||检查session是否含有用户名|-----------------||Y N||V V|pass.jsp 跳转------------------------->||||注销|V|logout.jsp------------------------------------>|---------------------------------------------------------------------index.jsp:
程序代码
indexString C_password="";//获取全部CookieCookie c[]=request.getCookies();for(i=0;i
{//在Cookie中查找用户名、密码,如果找到,则分别将其赋值给用户名、密码变量if("username".equals(c[i].getName()))
C_username=c[i].getValue();if("password".equals(c[i].getName()))
C_password=c[i].getValue();
}if(!"".equals(C_username)&&!"".equals(C_password))
{//Cookie中有用户名、密码,将用户名、密码提交到验证页面response.sendRedirect("check.jsp?username="+C_username+"&password="+C_password);
}else{//Cookie中没有用户名、密码,跳转到登录页面%>login.jsp:
程序代码
登录登录页面
用户名: | |
密 码: | |
Cookie选项: | 不保存保存1分钟 |
程序代码
验证页面String Password=request.getParameter("password");
String IsCookie=request.getParameter("cookie");//定义标志,标记是否为合法用户,true为合法,false为非法Boolean isUser=false;//定义数据库连接驱动finalString DBDRIVER="sun.jdbc.odbc.JdbcOdbcDriver";//定义数据库连接地址finalString DBURL="jdbc:odbc:member";//定义变量存放SQL语句String sql=null;//定义数据库连接对象Connection conn=null;//定义数据库操作对象PreparedStatement pstmt=null;//定义结果集ResultSet rs=null;try{//加载数据库驱动Class.forName(DBDRIVER);//连接数据库conn=DriverManager.getConnection(DBURL);//预预处SQL语句sql="Select * FROM member Where username=? and password=?";//实例化数据库操作对象pstmt=conn.prepareStatement(sql);//设置psmt中“?”对应的变量pstmt.setString(1,Username);
pstmt.setString(2,Password);//查询数据库,返回结果集rs=pstmt.executeQuery();if(rs.next())
{//数据库中有符合的记录,合法用户isUser=true;
}//关闭结果集rs.close();//关闭操作pstmt.close();//关闭连接conn.close();
}catch(Exception e)
{
System.out.println(e);
}//判断用户名、密码的合法性if(isUser)
{//合法用户if("save".equals(IsCookie))
{//如果选择了保存Cookie选项,则保存CookieCookie c1=newCookie("username",Username);
Cookie c2=newCookie("password",Password);//设置Cookie保存时间为1分钟c1.setMaxAge(60);
c2.setMaxAge(60);
response.addCookie(c1);
response.addCookie(c2);
}//设置session属性session.setAttribute("username",Username);//跳转到欢迎页面%>pass.jsp:
程序代码
登录成功{//session的username属性里含有用户名,可以浏览此页面%>
登录成功!!
欢迎光临!
注销登录
您还没有登录!
3秒之后跳转到登录页面如果没有跳转,请点这里
}%>
程序代码
登录失败登录失败!!
重新登录
程序代码
注销登录注销成功!
3秒后跳转到登录页面如果没有跳转,请点这里