发表于: 2020-06-17 23:41:13
1 1862
今天完成的事情:
1. 添加表单 CSRF 验证
2. 对用户密码加盐加密存储
收获:
1. 关于 CSRF(跨站请求伪造)
首先在用户的登陆的环节是没必要防范跨站请求伪造的,在这个项目中我做一下仅仅是为了了解一下。
跨站请求伪造的关键点在于服务端不知道这个表单是从哪里来的,是用户主动在网页上提交的还是恶意网站伪造了一个表单。
防范的方式就是在用户获取表单页面的时候我们在表单中填入一个隐藏的 input 标签放上一个随机生成的 token,同时往 session 里面塞一个 token。由于 session 是存储在服务器上,恶意网站获取不到也就无从得知 token 的信息,它恶意提交的时候表单里面的验证信息和 session 里面的信息是对不上的。
攻防本身就是道高一尺魔高一丈,只能是尽量避免一些已知的攻击方式。
项目中简单起见我使用了随机数作为验证 token
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page import="java.security.SecureRandom"%>
<%--生成随机数并且插入 session--%>
<%
SecureRandom secureRandom = new SecureRandom();
double _csrf = secureRandom.nextDouble();
session.setAttribute("_csrf", _csrf);
%>
<div>
<form action="${pageContext.request.contextPath}/check.html" method="post" >
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登录" />
</tr>
</table>
<%--在表单中插入同样的随机数--%>
<input type="hidden" name="_csrf" value="<%=_csrf%>" />
</form>
</div>
在拦截器中对提交进行了拦截与验证:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/check.html"/>
<bean class="cn.mogeek.util.LoginInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/u/**"/>
<bean class="cn.mogeek.util.UserInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
2. 对用户密码进行加密
直接用 jBCrypt 做完了,没什么好说的,这个加密的时候把盐值混进去了,我数据库没有设计盐值字段,刚好省事了。
遇到的问题:
无
明天的计划:
1. 处理一下跳转逻辑
2. 任务五深度思考
代码已上传 GitHub。
评论