最近在看一个web项目,发现一个很容易被忽视的问题,那就是“表单重复提交”,在一般页面会产生重复数据,可能影响不大,可是要是发生在登录面页,就是一个重大的安全漏洞,因为当你注销了系统,在后台代码里也清空了Session,但如果第一用户没有关闭浏览器,这样又来了个第二用户,那么他就很容易在不需要知道第一用户的用户名、密码的情况下,以第一用户的身份登录;他只需要使用浏览器的“Back”,后退到第一用户的登录页面,然后刷新,并选择“重试提交”,这样他就进入了系统。
其实这样的问题是很容易避免的,只是很多人没有注意到而已,在网上很Struts登录的例子中都存在这样的问题。
要避免它也很容易,只要在页面初始化时,给它注入一个Token,并页面提交时验证Token是否被提交过这可以了。
并且在Struts中好像还有现成的<Token>和Token验证可以使用,在ASP.NET中,使用一个Hidden的Input也很容易实现。