V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jiuwuerqi
V2EX  ›  问与答

请教一个 web 接口的安全性问题

  •  1
     
  •   jiuwuerqi · 2018-04-24 17:37:18 +08:00 · 2708 次点击
    这是一个创建于 2412 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前端就是简单的 :html+js

    背景 1: 生成认证流程:1:C 端用户登录 -》服务端生成 token -》带回到 C 端,存储 cookie 中 调其他的 web 接口必须带上 token,进行一些校验(时效,ip 等等)

    问题:这样被抓包了,别人拿到了 token,就可以调其他的 web 接口.并且可以任意的传递参数!!

    背景 2: 在 1 的基础上加上签名参数(sign,加个 时间戳 用 md5 加密)这样即使你拿到了我的 token,但是你不能对我们的参数进行修改

    问题:js 会暴露加密的过程!!

    暂时就想到这两个安全性的问题,不知道各位有什么好的方式??

    22 条回复    2018-04-25 18:23:46 +08:00
    x7395759
        1
    x7395759  
       2018-04-24 19:00:50 +08:00
    https
    Ryans
        2
    Ryans  
       2018-04-24 19:04:47 +08:00
    JWT 了解一下
    3a3Mp112
        3
    3a3Mp112  
       2018-04-24 19:11:19 +08:00
    token 被拿走是没办法的。 目前好像没解决方案。
    chinvo
        4
    chinvo  
       2018-04-24 19:13:15 +08:00
    HTTPS + HSTS 防中间人
    token 确保认证授权
    sign 防篡改
    chinvo
        5
    chinvo  
       2018-04-24 19:13:34 +08:00
    服务器端校验不信任任何客户端输入
    chinvo
        6
    chinvo  
       2018-04-24 19:15:30 +08:00
    理论上来讲,没必要全面禁止自行提交数据,反正只要服务器校验限定了数据的类型和范围,通过页面提交和通过 curl 提交并没有区别。

    如果是防机器人提交,可以引入 ReCAPTCHA,防爬可以引入 cookie 验证、频率限制等机制
    icy37785
        7
    icy37785  
       2018-04-24 22:07:00 +08:00 via iPhone
    只能增加难度,没办法彻底杜绝,加密和解密从来都是找加密信息价值和解密时间成本之间平衡点
    yxwzaxns
        8
    yxwzaxns  
       2018-04-24 23:25:31 +08:00 via iPhone
    说 jwt 的真的大丈夫?
    zjp
        9
    zjp  
       2018-04-24 23:58:05 +08:00 via Android
    token 不应该是服务器端生成吗,前端不知道加密算法和盐。
    bazingaterry
        10
    bazingaterry  
       2018-04-25 00:21:18 +08:00 via iPhone
    怕 token 被抓走就和 ip 綁定吧,參考銀行。
    WilliamLin
        11
    WilliamLin  
       2018-04-25 00:35:17 +08:00 via Android
    https 用于 token 防止被抓包,token 在后端生成,并可加入 ip 和 user agent 等信息,下次检验时不同,则认为 token 无效。
    LeungJZ
        12
    LeungJZ  
       2018-04-25 00:40:54 +08:00
    @WilliamLin
    请问下,这个 token 该如何生成呢?
    能给个思路吗?
    WilliamLin
        13
    WilliamLin  
       2018-04-25 00:47:58 +08:00 via Android
    我之前的一种做法,就是生成随机字符串,然后用这来做 id,加上需验证的信息写入数据库。如果不想这样,可了解 itsdangerous
    WilliamLin
        14
    WilliamLin  
       2018-04-25 00:48:14 +08:00 via Android
    @LeungJZ 我之前的一种做法,就是生成随机字符串,然后用这来做 id,加上需验证的信息写入数据库。如果不想这样,可了解 itsdangerous
    NicholasYX
        15
    NicholasYX  
       2018-04-25 07:09:37 +08:00 via iPhone
    个人感觉后台加验证,然后传入数据都是正常数据的话无所谓的
    ChefIsAwesome
        16
    ChefIsAwesome  
       2018-04-25 09:08:12 +08:00
    https + 较短的过期时间。
    jiuwuerqi
        17
    jiuwuerqi  
    OP
       2018-04-25 15:59:06 +08:00
    @zjp token 是服务端生成,但是你要把 token 带回前端,下次请求要带上 token。
    问题在于别人 抓到了你的 token,就可以请求了。
    然后进一步的新增一个 sign,来保证防止数据被出篡改,因为 sign 是在前端进行加密的,那么 js 容易暴露加密流程
    jiuwuerqi
        18
    jiuwuerqi  
    OP
       2018-04-25 16:05:42 +08:00
    @WilliamLin ip 和 agent 都是可以模拟的吧,我现在只是加了 ip,就是每次切换网段( WIFI -> 4G 之类的),要重新获取 token,用户体验可能会差一些 @icy37785 说的不错,只能增加难度,难度越大,性能就越低吧。
    jiuwuerqi
        19
    jiuwuerqi  
    OP
       2018-04-25 16:12:19 +08:00
    @chinvo 我不太懂验证码的原理,防止机器人提交的话,小白的问下,验证码是不是服务器生成会更安全一些?
    chinvo
        20
    chinvo  
       2018-04-25 16:36:32 +08:00
    @jiuwuerqi #19 传统意义上的图片(字符)验证码已经很难防止机器人识别了,因此引入更加强力的验证码是有必要的。

    说 ReCAPTCHA 第二,估计也就只有国内某些厂家敢称第一
    zjp
        21
    zjp  
       2018-04-25 16:41:39 +08:00 via Android
    @jiuwuerqi #17 我所说的 token 包含签名部分…前端加密和不加有什么区别呢
    WilliamLin
        22
    WilliamLin  
       2018-04-25 18:23:46 +08:00 via Android
    @jiuwuerqi 看你系统用户数,如果系统就万把来人用,不用去担心性能问题,另外,我是用了 nosql 的 kv 来保存 token 的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1056 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:00 · PVG 03:00 · LAX 11:00 · JFK 14:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.