问题描述
|
在jsp Login或Session()中,最好在会话中放入用户名或ID?
并在servlet或jsp页面上进行测试吗?
我在外面的jsp页面中使用此代码,但我认为这不安全
<%if(session.getAttribute(\"username\") == null){%>
<%
String err ;
Connection cnn;
Class.forName(System.getProperty(\"database.driver\",\"com.MysqL.jdbc.Driver\"));
cnn = DriverManager.getConnection(\"jdbc:MysqL://localhost:3306/sondage\",\"root\",\"\");
Statement stat1 = cnn.createStatement();
String Username,Password;
Username=request.getParameter(\"UserName\");
Password=request.getParameter(\"passWord\");
//Le nomre de produits
ResultSet resultat = stat1.executeQuery(\"select * from utilisateur where username =\'\"+ Username +\"\' and password = \'\"+Password+\"\'\");
if (resultat.next()) {
session.putValue(\"username\",Username);
Requestdispatcher rd =request.getRequestdispatcher(\"Vote.jsp\");
rd.forward(request,response);
}
else {
Requestdispatcher rd =request.getRequestdispatcher(\"authentification.jsp?err=1\");
rd.forward(request,response);
}
%>
解决方法
这完全取决于您。我个人只是在其中放置了一个表示“ 1”实体的Javabean,这样我就可以立即访问其所有属性,并且通常在servlet中进行操作。
@Override
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
String username = request.getParameter(\"username\");
String password = request.getParameter(\"password\");
User user = userDAO.find(username,password);
if (user != null) {
request.getSession().setAttribute(\"user\",user);
response.sendRedirect(\"userhome\");
} else {
request.setAttribute(\"message\",\"Unknown login,try again\");
request.getRequestDispatcher(\"/WEB-INF/login.jsp\").forward(request,response);
}
}
只有几件事情是怪异的/不安全的:
<%if(session.getAttribute(\"username\") == null){%>
为什么要检查?是否不允许该用户以其他用户身份重新登录?为此,您应该使用Filter
。
ResultSet resultat = stat1.executeQuery(\"select * from utilisateur where username =\'\"+ Username +\"\' and password = \'\"+Password+\"\'\");
这是一个SQL注入孔。继续阅读有关SQL注入攻击和准备好的语句的信息。
最后,我错过了“ 6”块,在该块中,您正确地关闭了JDBC资源,以防止它们泄漏,这可能导致您的应用程序在DB耗尽所有资源时长期崩溃。