防止数据恶意重复提交的方法

真正上线运行的项目,这种情况应该予以考虑!例如:有人恶意注册,在app端一秒戳屏按钮十下左右。


根据网上提供的方案,总结出以下几种方法:

1.禁止重复点击按钮

当用户点击数据提交按钮时,使用javascript将按钮属性设置为disabled。这种方法可防止心急的、不懂js的用户多次点击。但有一个问题,会js的可将浏览器设置禁用js或者通过调试台修改js代码,那么该方法就失效了。


2.在session中存放一个表单Token标志。

表单呈现给用户前,服务端应该对该表单做一个Token标志,存入session 中。当用户将表单数据提交时,对该标志进行检查,如存在且一致,正常处理表单数据,然后删除该标志或者重新生成新的Token标志。如果不存在或者不一致,即表明该表单数据要么提交过、要么就是非法数据(可能被人动过手脚),则忽略此次数据提交!

该方式可大大提高数据安全,具备较高级的XSRF防护(XSRF攻击见后面介绍)。


3.在数据库添加约束

在数据库里添加唯一约束或者创建唯一索引,防止出现重复数据。是最有效的防治重复提交的方法了。


综上所述:结合2和3,可使数据提交更加安全。下面介绍XSRF的web攻击!

XSRF全称是 cross-site request forgery(跨站点请求伪造),也称为CSRF,是一种常见的web攻击方式。

攻击形式描述如下:

1.用户登录并访问一个正常的站点 http://www.biz.com;

2.在同一个浏览器实例下,用户打开了恶意网站 http://www.bad.com;(至于用户怎么会打开这个恶意网站,可能是恶意网站通过一些链接或者垃圾邮件等等形式诱骗用户点了某一个链接)

3.恶意网站页面里包含下面一段代码:

<form method="POST" name="evilform" target="hiddenframe"
     action="https://www.biz.com/update_profile">
<input type="hidden" name="password" value="heihei">
</form>
<iframe name="hiddenframe" style="display: none">
</iframe>
<script>
    document.evilform.submit();
</script>

你明白下面会发生什么了:用户在不知觉的情况下,被修改了密码(只要恶意网站也使用过https://www.biz.com/,记住该域名下修改密码的操作参数名即可)。

如何防御XSRF攻击,方法比较多,比如在上面的例子中,要修改密码,必须提供旧密码,那么就可以有效的避免攻击。但是,XSRF是一个普遍存在的问题,不能所有场景下都需要用户输入一串东西,用户肯定会崩溃。

比较靠谱和通用的解决方案如下:

在进行一些改变系统数据的重要操作中(比如提交订单,修改密码,删除..等操作),加入一个供校验的action token。这个action token是由应用先前生成的(如绘制表单时),作为表单的一个hidden字段。

这个action token的生成必须要有些讲究,不能让骇客随意冒充过关,一个靠谱的生成算法如下:

action token = F(K,C),其中K是一个只有应用服务器才知道的密钥,C是本次会话的标识,如jsessionid。

应用在接受到请求时,首先校验action token是否合法,校验的方式是取出jsessionid,然后使用F(K,C)计算action token,如果计算的结果和表单提交过来的action token值一样,则放行。

这种方案可以有效的防御XSRF攻击,因为恶意网站无法知道K和C的值,无法伪造action token。

但是如果你的站点遭遇了XSS攻击,那么一切都白搭,因为骇客可以轻易的获取session cookie,冒充用户身份直接攻击即可。


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值