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

如何防止用户篡改数据

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

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

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

    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
    数据记录的可信度,可以在插入操作前对用户输入的数据进行检查,比如是否有不符合插入数据规定外的敏感危险字符?做好数据的过滤,规定好插入数据的格式,不符合的禁止插入,或者设置一些正则表达式,对敏感字符进行替换处理~另外,从你的业务场景里可以看出,如何防止登入的用户直接手动调用?这个可能就涉及到用户登入系统后,插入数据的接口可能会暴露,可以适当对调用此接口的用户做些鉴权,也要防止越权,不过最关键的个人认为还是对传入数据的过滤处理~
    106npo
        6
    106npo  
       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     Solana     5214 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 07:15 PVG 15:15 LAX 00:15 JFK 03:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86