Ce qui suit est la pièce de code Java à l'aide de filtres qui affiche la page d'erreur à chaque fois si le nom d'utilisateur et le mot de passe sont également corrects. Aidez-moi s'il vous plaît, je n'ai pas beaucoup de connaissances sur ce concept.
String sql="select * from reg where username='"+user+"' and pass='"+pwd+"'"; rs=st.executeQuery(sql); if(rs.next()) { chain.doFilter(request,response); } else sc.getRequestDispatcher("/error.html").forward(request,response);
4 Réponses :
Utilisez une déclaration préparée, votre code est une invitation ouverte pour un Injection SQL . < Pré> xxx pré>
Maintenant pour votre question, veuillez vérifier: p>
Tout d'abord, vous devez utiliser vraiment des requêtes paramétrées pour cela. Si l'utilisateur entre dans Aussi, êtes-vous sûr que le nom d'utilisateur et le mot de passe sont corrects? Que diriez-vous de la capitalisation? P> '"; Drop Table Reg; code> comme nom d'utilisateur, vous aurez de gros problèmes. P>
Tant de choses qui ne vont pas avec ça ...: - / p>
Sélectionnez * à partir de Reg code> est inutile que vous voulez juste savoir si une ligne existe. Si vous avez utilisé SELECT 1 code> au lieu de la place, la base de données n'aurait pas à inspecter le contenu de la ligne et pourrait servir les résultats de la requête uniquement à l'index. Si vous vous attendez à ce qu'il y ait beaucoup de lignes, Sélectionnez 1 où il existe ... code> serait plus rapide car cela permettrait à la DB de courte circulaire la requête après avoir trouvé au moins une ligne. LI>
- Vous ne fermez pas la déclaration et le résultat défini dans
enfin code> blocs. Cela signifie qu'ils ne sont pas garantis toujours (par exemple, s'il y a un SQLException code> lancé) menant aux fuites de ressources et de connexion. LI>
ol>
chaîne SQL = "Sélectionnez * à partir de Reg où USERNAME = '" + utilisateur + "' et passe = '" + pwd + "'"; P>
C'est une très mauvaise pratique. Cette approche exige que le nom d'utilisateur et le mot de passe soient passés autour de la vanille ordinaire via des demandes. De plus, vous y êtes un trou d'attaque d'injection SQL. P>
Utilisez des sessions, dans JSP / servlet, vous avez le
httpsession code>
pour. Il n'y a vraiment pas non plus besoin de toucher la DB à nouveau et à nouveau sur chaque requête en utilisant un fichiercode>. C'est inutilement coûteux. Il suffit de mettre
utilisateur code> en session à l'aide d'un servlet code> et d'utiliser le filtre
code> pour vérifier sa présence sur chaque demande. P>
Commencez par A
/login.jsp code>: p>
xxx pré> puis, créez un
logisservlet code> qui est mappé sur
Modèle d'URL code> de
/ login code> et a le
dopost () code> implémenté comme suit: p>
xxx pré> alors, créez un
loginfilter code> qui est mappé sur
URL-motif code> de
/ sécurisé / * code> (vous pouvez choisir votre choix, par exemple
/ protégé / * code>,
/ restreint / * code>,
/ users / * code>, etc., mais cela doit au moins couvrir toutes les pages sécurisées, vous devez également mettre les JSP dans le Dossier approprié dans WebContent) et possède le
DOFILTER () CODE> implémenté comme suit: P>
HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(false); String loginURI = request.getContextPath() + "/login.jsp"; boolean loggedIn = session != null && session.getAttribute("user") != null; boolean loginRequest = request.getRequestURI().equals(loginURI); if (loggedIn || loginRequest) { chain.doFilter(request, response); // User is logged in, just continue request. } else { response.sendRedirect(loginURI); // Not logged in, show login page. }
Que diriez-vous d'utiliser la sécurité de printemps? Petit et propre ...
@bastianneu: Et que diriez-vous d'utiliser la police d'assurance ING? Vous devriez penser avant de suggérer rien. Si quelqu'un n'obtient même pas un cadre, le printemps est loin, comment pouvez-vous simplement suggérer la sécurité du printemps. Je veux dire c'mon. Aucune infraction prévue.