恶意提交攻击
拦截且修改
客户端发送到服务端接口的请求被第三方拦截,然后修改数据,再提交给客户端执行
例如:
- 客户端发送了将username重置为“小明”的请求
- 第三方拦截后修改为username重置为”小红”
- 然后提交给服务器执行
- 服务器认证了用户身份后(cookie或token都是客户端发出的,因此能通过认证)
-
拦截不修改,重复提交攻击
例如:
客户端发送一个更新user表的请求
- 第三方拦截
- 然后短时间内复制重复提交
- 服务器认证后不断往数据库写数据
解决方案
签名
防篡改
- 客户端提交请求之前,先对自己请求的参数全部进行拼接加密得到一个加密字符串sign
- 请求参数加上sign,然后再发送给服务器
- 服务器将参数获取后也进行相同的拼接加密得到自己的sign
- 比较与客户端发来的sign是否相同
- 不相同则是被第三方修改过的,拒绝执行
关键:
原理:服务器获取请求的timestamp,然后比较自身系统时间,如果相差超过设定时间就是超时,该请求无效
作用:就算第三方截取了该请求,它也只能在设定时间内进行重放攻击
- 客户端的请求参数上加一个随机字符串string
原理:服务端获取请求的随机字符串string,然后查看是否在设定时间内别的请求使用过该string,被使用过就判定无效
作用:加上timestamp,就造成短时间内一个请求只能使用一次,因为就算请求被拦截,它请求成功一次后,第二次复制重放时就因为随机字符串被使用而被拒绝