• 接口服务数据被劫包,如何防止数据恶意提交(道乐)


    恶意提交攻击

    1.拦截且修改:客户端发送到服务端接口的请求被第三方拦截,然后修改数据,再提交给客户端执行

    例如:

    1. 客户端发送了将username重置为“小明”的请求
    2. 第三方拦截后修改为username重置为"小红"
    3. 然后提交给服务器执行
    4. 服务器认证了用户身份后(cookie或token都是客户端发出的,因此能通过认证)
    5. 那么客户端的username就被修改为“小红”

    2.拦截不修改,重复提交攻击

    例如:

    1. 客户端发送一个更新user表的请求
    2. 第三方拦截
    3. 然后短时间内复制重复提交
    4. 服务器认证后不断往数据库写数据

     

    解决方案--签名:对客户端发来的请求进行签名

    1.防篡改

    1. 客户端提交请求之前,先对自己请求的参数全部进行拼接加密得到一个加密字符串sign
    2. 请求参数加上sign,然后再发送给服务器
    3. 服务器将参数获取后也进行相同的拼接加密得到自己的sign
    4. 比较与客户端发来的sign是否相同
    5. 不相同则是被第三方修改过的,拒绝执行

    关键:

    1. 第三方不知道加密方式和请求参数拼接规则,而客户端与服务器是知道的,因此第三方不知道修改参数后如何生成与服务器生成相同的sign
    2. 只要请求修改了一点点加密得到的就是不同的签名

    2.防重放

    (1)客户端的请求参数上加一个请求时间timestamp

    原理:服务器获取请求的timestamp,然后比较自身系统时间,如果相差超过设定时间就是超时,该请求无效

    作用:就算第三方截取了该请求,它也只能在设定时间内进行重放攻击

    (2)客户端的请求参数上加一个随机字符串string

    原理:服务端获取请求的随机字符串string,然后查看是否在设定时间内别的请求使用过该string,被使用过就判定无效

    作用:加上timestamp,就造成短时间内一个请求只能使用一次,因为就算请求被拦截,它请求成功一次后,第二次复制重放时就因为随机字符串被使用而被拒绝

    ----------------------------------------以前的答案---------------------------------------------

    // 1.使用session验证身份(查看id与session中id是否一致)

    // 2.对id进行加密处理等(如果id被恶意修改,篡改者不知道加密方法则服务端可查证)

    // 3.设置提交的间隔时间限制来防止重复提交

    // 4.在session中设置提交标志(每一次服务器将表单呈现给客户端前设置一个标志,然后客户端提交表单时再验证该标志)

     

  • 相关阅读:
    Linux文件系统命令 cd
    Linux文件系统命令 cat
    正则表达式(.+?)与(.+)区别
    Linux文件系统命令 ls
    如何正确认识Docker Kubernetes 和 Apache Mesos
    基于Nutch Solr等基于搭建一体化的数据抓取平台
    ubuntu apache ssl配置
    机器学习入门
    docker 安全性问题
    数据工程师面试必备——Python与数据库的那些事
  • 原文地址:https://www.cnblogs.com/ming-szu/p/8926179.html
Copyright © 2020-2023  润新知