V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
unt
V2EX  ›  程序员

如何防止用户篡改数据

  •  
  •   unt · 2023-12-19 10:53:22 +08:00 · 3380 次点击
    这是一个创建于 372 天前的主题,其中的信息可能已经有所发展或是发生改变。

    业务场景是在用户进行了某项操作后(比如说点击了某页面按钮),调后端接口往数据库里差一条操作记录,如何保证这条记录的可信度。

    如何防止稍微懂点知识的用户直接手动调用这个接口。

    21 条回复    2023-12-20 10:42:53 +08:00
    codehz
        1
    codehz  
       2023-12-19 10:57:29 +08:00
    所以要在后端验证啊,你前端验证只是保证用户体验用的
    coderxy
        2
    coderxy  
       2023-12-19 10:57:42 +08:00
    你是 web 应用还是 app 啊? app 的话可以接口加签名。
    mdn
        3
    mdn  
       2023-12-19 11:01:02 +08:00
    不考虑用户体验的话,加个滑块验证,像抢红包一样
    xuanbg
        4
    xuanbg  
       2023-12-19 11:08:29 +08:00
    如果这个接口是前端可以直接调用的话,那么答案就是无法保证这条记录的可信度。除非这个动作只能在服务端发起并完成,譬如我在网关上根据用户调用接口的行为,在日志中记录其请求参数,这种数据就是可信的。
    yxdm007
        5
    yxdm007  
       2023-12-19 11:15:17 +08:00
    数据记录的可信度,可以在插入操作前对用户输入的数据进行检查,比如是否有不符合插入数据规定外的敏感危险字符?做好数据的过滤,规定好插入数据的格式,不符合的禁止插入,或者设置一些正则表达式,对敏感字符进行替换处理~另外,从你的业务场景里可以看出,如何防止登入的用户直接手动调用?这个可能就涉及到用户登入系统后,插入数据的接口可能会暴露,可以适当对调用此接口的用户做些鉴权,也要防止越权,不过最关键的个人认为还是对传入数据的过滤处理~
    xmumiffy
        6
    xmumiffy  
       2023-12-19 11:17:45 +08:00 via Android
    如果是用户能操作的值,那防不了
    如果是不能操作的值,你自己就能判断出来
    KOMA1NIUJUNSHENG
        7
    KOMA1NIUJUNSHENG  
       2023-12-19 11:30:20 +08:00
    为什么插入日志这种动作要在前端发起接口来实现,不是应该处理完主业务之后再执行插入日志操作吗。和前端唯一的互动就是点击按钮调用接口那一下。
    weeei
        8
    weeei  
       2023-12-19 11:54:46 +08:00
    后端判断用户此次操作的合法性,如果是购买商品操作,可能不是用户 post 一个请求你就给他发货吧。
    具体如何判断操作合法性,看你的具体场景。
    smdbh
        9
    smdbh  
       2023-12-19 12:02:27 +08:00
    感觉这两种操作没区别,都是合理操作,防是个伪命题
    aaniao002
        10
    aaniao002  
       2023-12-19 12:21:22 +08:00 via Android
    你看目前大型网站哪家能防趴?
    renfei
        11
    renfei  
       2023-12-19 12:24:38 +08:00
    签名+时间戳,能解决大部分人,真正的高手防不住
    unt
        12
    unt  
    OP
       2023-12-19 13:27:41 +08:00
    @renfei #11 web 软件,不是 app ,签名是指什么。 时间戳的话具体怎么操作
    unt
        13
    unt  
    OP
       2023-12-19 13:31:33 +08:00
    我凭空想到的一个方法是通过一个动态秘钥来交互,每次发给后端需要后端校验是否符合,用过一次的秘钥不能再使用
    renfei
        14
    renfei  
       2023-12-19 15:19:18 +08:00
    @unt web 端,我可以看到你的代码,我模仿你的逻辑,先调用动态密钥接口获取一个,拿到这个密钥再调用下一个接口,不就行了。
    时间戳可以防止请求被拦截重放,签名可以验证是否被篡改,只会皮毛的脚本小朋友就会放弃,大佬的话你还是拦不住的
    任何软件都能破解,只是代价不同,只要够让大部分人放弃就行了,收益比代价大的时候,就会放弃破解
    unt
        15
    unt  
    OP
       2023-12-19 15:23:04 +08:00
    @renfei #14 动态秘钥不是调接口获取的。类似双因素认证,只不过我想的是一个秘钥集合
    renfei
        16
    renfei  
       2023-12-19 15:26:20 +08:00
    @unt 你标题是防止用户自己篡改,双因素的验证码,也在用户自己手里,你怎么觉得能区分用户给你 post 真的数据还是假的数据呢
    cybird
        17
    cybird  
       2023-12-19 15:38:00 +08:00
    所以才会有谷歌的:
    " I'M NOT A ROBOT "
    otakustay
        18
    otakustay  
       2023-12-19 16:40:10 +08:00
    @unt #13 这就是最简单的 CSRF Token ,可以防部分,但懂的人自己做浏览器自动化肯定能模拟出来
    BD8NCF
        19
    BD8NCF  
       2023-12-19 19:04:53 +08:00
    前端只是 UI ,业务逻辑在后端,你肯定要在后端验证合法性啊
    param
        20
    param  
       2023-12-20 09:27:33 +08:00 via Android
    没表述清楚,让人不想答。答了的都是猜的需求。
    veni2023
        21
    veni2023  
       2023-12-20 10:42:53 +08:00
    https 双向认证+签名+加密
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5205 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 01:17 · PVG 09:17 · LAX 17:17 · JFK 20:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.