使用JSP基于数据库完成用户登陆程序
使用Statement存在安全问题:SQL注入漏洞
select * from person where name="darkness" and password="wind" or "1"="1"
密码:wind" or "1"="1
---------------person.sql----------------------DROP TABLE person ;CREATE TABLE person ( id varchar(20) not null primary key , name varchar(20) not null , password varchar(20) ) ;INSERT INTO person (id,name,password) VALUES ('darkness','wind','ffffff') ;INSERT INTO person (id,name,password) VALUES ('cloud','sky','wind') ;-- 提交事务commit ;
--------------------login.jsp-------------<%@page contentType="text/html;charset=gb2312"%><html><head> <title>登陆</title></head><body><center> <h1>登陆范例——用户名及密码固定</h1> <hr> <br> <br> <form action="login_conf.jsp" method="post"> <table> <tr> <td colspan="2">用户登陆</td> </tr> <tr> <td>用户名:</td> <td><input type="text" name="uname"></td> </tr> <tr> <td>密 码:</td> <td><input type="password" name="upassword"></td> </tr> <tr> <td colspan="2"> <input type="submit" value="登陆"> <input type="reset" value="重置"> </td> </tr> </table> </form></center></body></html>
-----------------------login_conf.jsp------------<%@ page contentType="text/html;charset=gb2312"%><%-- 导入java.sql包,表示要使用数据库操作 --%><%@ page import="java.sql.*"%><html><head> <title>登陆</title></head><body><center> <h1>登陆范例——用户名及密码固定</h1> <hr> <br> <br> <% // 接收请求的内容 String name = request.getParameter("uname") ; String password = request.getParameter("upassword") ; // 定义变量,如果用户是合法用户,则将此标记变为true boolean flag = false ; %> <% // 定义数据库操作的常量、对象 // 数据库驱动程序 final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; // 数据库连接地址 final String DBURL = "jdbc:oracle:thin:@localhost:1521:sky" ; // 数据库用户名 final String DBUSER = "scott" ; // 数据库连接密码 final String DBPASSWORD = "darkness" ; // 声明一个数据库连接对象 Connection conn = null ; // 声明一个数据库操作对象 PreparedStatement pstmt = null ; // 声明一个结果集对象 ResultSet rs = null ; // 声明一个SQL变量,用于保存SQL语句 String sql = null ; %> <% // 进行数据库操作 try { // 编写SQL语句 sql = "SELECT name FROM person WHERE id=? and password=?" ; // 加载驱动程序 Class.forName(DBDRIVER) ; // 连接数据库 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ; // 实例化数据库操作对象 pstmt = conn.prepareStatement(sql) ; // 设置pstmt的内容 pstmt.setString(1,name) ; pstmt.setString(2,password) ; // 查询记录 rs = pstmt.executeQuery() ; // 判断是否有记录 if(rs.next()) { // 如果有记录,则执行此段代码 // 用户是合法的,可以登陆 flag = true ; } // 依次关闭 rs.close() ; pstmt.close() ; conn.close() ; }catch(Exception e){} %> <% // 判断用户名及密码 if(flag) { // 合法用户 %> <jsp:forward page="login_success.jsp"/> <% } else { // 非法用户 %> <jsp:forward page="login_failure.jsp"/> <% } %></center></body></html>
----------------------login_success.jsp-------------<%@page contentType="text/html;charset=gb2312"%><html><head> <title>登陆</title></head><body><center> <h1>登陆范例——用户名及密码固定</h1> <hr> <br> <br> <h2>登陆成功</h2> <h3>欢迎<font color="red" size="15"> <%=request.getParameter("uname")%> </font>光临!!!</h3></center></body></html>------------------login_failure.jsp-------------<%@page contentType="text/html;charset=gb2312"%><html><head> <title>登陆</title></head><body><center> <h1>登陆范例——用户名及密码固定</h1> <hr> <br> <br> <h2>登陆失败</h2> <h3>错误的用户名及密码!!!</h3> <a href="login.jsp">重新登陆</a></center></body></html>