关于如何防止登录验证绕过问题

学码就是爱好 2020-10-18 10:47:15
网站有3个登录文件,分别是login.jsp,check_login.jsp, login_success.jsp账户与密码验证通过则跳转 login_success.jsp.
现在的问题是,实际上如果用户知道了login_success.jsp,可以直接敲地址访问,网上说通过 session机制解决,我想问问,在我的实例中怎么编代码。
login.jsp的代码如下
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录案例</title>
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row" style="margin-top: 30px">
<div class="col-md-4 col-md-offset-4">
<div class="panel panel-primary">
<div class="panel-heading">
<span class="glyphicon glyphicon-user"></span>登录
</div>
<div class="panel-body">
<form action="check_login.jsp" method="POST" name="loginForm">
<div class="form-group">
<label for="name">用户名</label> <input type="text"
class="form-control" name="name" placeholder="请输入用户名">
</div>
<div class="form-group">
<label for="">密码</label> <input type="password"
class="form-control" name="pwd" placeholder="请输入密码">
</div>
<button type="submit" class="btn btn-primary"
onclick="return checkForm()">登录</button>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
crossorigin="anonymous">

</script>
<script type="text/javascript">
function checkForm() {
var name = loginForm.name.value;
var pwd = loginForm.pwd.value;
//alert(name + pwd);
if (name == "" || name == null) {
alert("请输入用户名");
loginForm.name.focus();
return false;
} else if (pwd == "" || pwd == null) {
alert("请输入密码");
loginForm.pwd.focus();
return false;
}
return true;
}
</script>
</html>

check_login.jsp代码为
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/testapp?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "123456";
conn = DriverManager.getConnection(url, username, password);
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String sql = "SELECT *FROM userinfo WHERE user ='" + name + "'AND password = '" + pwd + "'";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if (rs.next()) {
response.sendRedirect("./login_success.jsp");
}else{
response.sendRedirect("./login.jsp");
}
%>

login_success.jsp的代码是
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>日暮黄昏</title>
</head>
<body>

<a href="./movie/index.html" target="_blank">movie</a>

<p></p>
<a href="./jpg/index.html" target="_blank">jpg</a>

<p></p>
<a href="./txt/index.html" target="_blank">txt</a>

<p></p>

</body>
</html>
...全文
8704 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ohmydog1 2020-10-29
  • 打赏
  • 举报
回复
漏洞的话,要看标准是如何了。作为学校练习,作业已经完成了,基本也能防止绕过登录直接通过url打开其他页面。但要是工作中的作品,那肯定是不合格产品的。 一般做web项目,是不可能设计这样简陋的流程的,不可能所有代码一股脑的在jsp里实现。像其他回复说的那样,应该有框架概念,要做把登陆功能做在controller(或者servlet、action)里,把登陆验证功能做在拦截器里。 登录功能作为项目安全的防范重点,同时还要做很多安全防范功能,比如防sql注入、防暴力破解、禁明文传输等等。
weixin_42042362 2020-10-22
  • 打赏
  • 举报
回复
理论上就是用户登录成功后你的服务器需要向用户发送一个标识信息(可以是任何字符串,但是在服务器中每个用户要对应一个独立且唯一的标识),然后用户每次请求服务器都要带上这个唯一标识,服务器就知道这个用户是谁是不是登录过的。要注意的是这个标识最好是有生命周期(半小时左右),不能永久在服务器中存在,最好是用户每次操作重置唯一标识的生命周期。web项目中一般用session来记录。也可以自定义,比如token这种东西。
学码就是爱好 2020-10-22
  • 打赏
  • 举报
回复
已经成功了,具体修改如下check_login.jsp:
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/testapp?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "123456";
conn = DriverManager.getConnection(url, username, password);
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String sql = "SELECT *FROM userinfo WHERE user ='" + name + "'AND password = '" + pwd + "'";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if (rs.next()) {
session.setAttribute("logUser",name);//登录成功时设置session
response.sendRedirect("./login_success.jsp");
}else{
session.removeAttribute("logUser");//登录失败时移除session,这个看你需求
response.sendRedirect("./login.jsp");
}
%>

login_success.jsp修改如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% if(session.getAttribute("logUser")!=null){
;//此处输出删除,显得无痕

}else{
response.sendRedirect("./login.jsp");//此处直接跳转登录页
}%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>日暮黄昏</title>
</head>

<body>

<a href="./movie/index.jsp" target="_blank">movie</a>

<p></p>
<a href="./jpg/index.jsp" target="_blank">jpg</a>

<p></p>
<a href="./txt/index.jsp" target="_blank">txt</a>


<p></p>

</body>
</html>

另外所有网页都用jsp后缀来判断是否是登录用户,例如 ./movie/index.jsp,将其内容修改为
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% if(session.getAttribute("logUser")!=null){
;

}else{
response.sendRedirect("/jsp2app/login.jsp");
}%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>影视天地</title>
</head>
<body>
<video width="320" height="240" controls autoplay>
<source src="movie.mp4" type="video/mp4">
<source src="movie.ogg" type="video/ogg">
<source src="movie.webm" type="video/webm">
您的浏览器不支持 video 属性。
</video>
<video width="960" height="540" controls autoplay>
<source src="jxts.mp4" type="video/mp4">
<source src="jxts.ogg" type="video/ogg">
<source src="jxts.webm" type="video/webm">您的浏览器不支持 video 属性。
</video>

<p></p>

</body>
</html>

非常感谢,已经达到我的需求了。另外问一下,这个实现是不是有漏洞,漏洞明不明显。
学码就是爱好 2020-10-22
  • 打赏
  • 举报
回复
引用 12 楼 ohmydog1 的回复:
页面名写错了,上面第一块代码是check_login.jsp的

感谢,我先测试一下
ohmydog1 2020-10-22
  • 打赏
  • 举报
回复
页面名写错了,上面第一块代码是check_login.jsp的
ohmydog1 2020-10-22
  • 打赏
  • 举报
回复
在你的login_success.jsp里

//登录成功时设置session
session.setAttribute("logUser",name);
//登录失败时移除session,这个看你需求
//session.removeAttribute("logUser");
在你的login_success.jsp里

if(session.getAttribute("logUser")!=null){
	out.print("登录成功");
	//成功后的业务	
}else{
	out.print("请先登录");
	//未成功的业务,可以重定向到登录页
}
学码就是爱好 2020-10-22
  • 打赏
  • 举报
回复
理论清楚就是代码不会写,哪位大神能在我代码的基础上增加这样的功能,如果很复杂就算了,毕近没什么能回报的。
笑面猪仔 2020-10-19
  • 打赏
  • 举报
回复
认真学习一下
rumlee 2020-10-19
  • 打赏
  • 举报
回复
在check_login.jsp中往session写入user的内容,然后在login_success.jsp读取session中的user内容,如果能够读取到则可以访问,否则跳转到login.jsp 为了方便,你可以写个拦截器拦截除了login.jsp和check_login.jsp之外的所有请求,判断session中是否有user,如果有就放行,如果没有则跳转到login.jsp
KeepSayingNo 2020-10-19
  • 打赏
  • 举报
回复
可以配置一个拦截器处理Interceptors
学码就是爱好 2020-10-19
  • 打赏
  • 举报
回复
引用 2 楼 dkwuxiang 的回复:
过滤器,放过 login.jsp,check-login.jsp, check-login.jsp 中登录成功后,session中记录是否已登录, 其他请求都需要 验证session中是否标记是否已登录,未登录重定向到 loin.jsp,已登录 放行

理论是在网上查到了,甚至还有代码,但是代码都不是实例中应用的,或者说我还不知道怎么放在实例中,希望有朋友帮忙具体如何在我的实例中实现。
另外是不是要在数据库中增加session的内容,如果需要,我可以在mysql操作增加
dkwuxiang 2020-10-19
  • 打赏
  • 举报
回复
过滤器,放过 login.jsp,check-login.jsp, check-login.jsp 中登录成功后,session中记录是否已登录, 其他请求都需要 验证session中是否标记是否已登录,未登录重定向到 loin.jsp,已登录 放行
ziqi0716 2020-10-19
  • 打赏
  • 举报
回复
大概意思就是说: 1.服务器后台在用户登录成功后,给客户端发一个字符串,并存在服务端这边. 2.然后客户端再来请求的时候,必须附带上这个字符串,服务端检查这个字符串是否合法 a.如果不合法,返回登录界面; b.如果合法继续处理用户请求. 当然每一步都可以简单做,也都可以复杂做,通常大家都会用现成的框架或中间件来做,java的不熟悉,但是原理一样.
maradona1984 2020-10-19
  • 打赏
  • 举报
回复
实际的架构远比你想的复杂,基本都会用到各种框架,而且所有请求基本都不会直接访问jsp的,都是先servlet/controller/action再跳转. 校验是否登录,过滤器就可以搞定,如何维持会话,那得看你采用的什么方案,大体差不多.
学码就是爱好 2020-10-18
  • 打赏
  • 举报
回复
说明一下,本人没学过java或者java scrip编程,学过一些c语言,根据经验修改网上给的代码,但是网上关于session的用法,只有使用的部分,它的前后关系不清楚,所以请大神帮忙指点一下,在我的实例中如何实现防止绕过登录验证的功能。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧