V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nlimpid
V2EX  ›  API

请问如何防止 API 接口参数暴露?

  •  
  •   nlimpid ·
    nlimpid · 2017-05-06 01:45:04 +08:00 · 6436 次点击
    这是一个创建于 2518 天前的主题,其中的信息可能已经有所发展或是发生改变。
    实现一个 API 的接口,但是要防止接口信息暴露,有什么好的方法吗?比如根据用户名查询用户的信息,https 还是能看到接口请求的内容,别人也能使用这个接口查别人的信息。有以下几个方案。

    1. 加密内容。用一个密钥和所有的参数签名成一个 sign,请求时候加上这个 sign。这样不知道密钥,即使看到了所有的参数也无法访问别人的。
    2. jwt。请求(比如登录)一个 token,每次附带这个 token 请求即可。优点是不需要客户端每次加密,缺点是如果 token 丢了很危险?
    3. oauth ?如果需要开放给第三方的平台会是个好选择把,但是如果客户端 /服务端都是第一方 oauth 是否也是可行的呢?

    烦请不吝指教。
    5 条回复    2017-05-06 22:19:15 +08:00
    isCyan
        1
    isCyan  
       2017-05-06 01:50:21 +08:00 via Android
    加密当然没什么大用,用户认证啊,最简单的 HTTP Basic Auth 或者复杂点 Header 里面传内容用 Key 的 HMAC 签名都可以,甚至用户登录留下个 Cookie 都有用
    tlday
        2
    tlday  
       2017-05-06 03:39:35 +08:00 via Android   ❤️ 3
    你的重点不对。不过我也不是专业的后端,浅谈几点拙见,如果有误烦请楼下不吝指出。
    https 是为了防止中间人攻击,信息的发送者和接收者其实都是知道发送的是什么东西的。所以只是保证传输过程的安全可靠。(比如某个人架了免费代理,不知情的用户用了这个代理,数据报在传输过程中被记录,那么这个人就可以伪造为这个不知情的用户来窃取这个用户的信息等等,https 可以避免这种情况)
    你要明确你想防御的对象是谁,是防止中间人窃取了用户 A 的"令牌"伪造成用户 A 窃取用户 A 的信息?那 https 可以很好的解决这个问题。
    但是如果你想防御的是 A 用户根据接口参数猜出参数意义借以窃取 B 用户的信息,那么你要在服务端作鉴权,A 用户不应当有访问 B 用户信息的权力。
    至于剩下你说的那些,无论是 session 还是 token 都只是鉴别 A 用户确实是 A 用户的"令牌",都有过期时间。
    你想考虑的这种情况说,如果是用户自己的浏览器或系统,软件,被 crack,导致 cookie 等信息泄露,那么你其实能做的不多。唯一能做的就是类似(异地登录短信提醒,ip 突然变更要求重新输入密码)这种措施来提醒用户你的客户端环境不安全,可能被黑了,并提醒用户及时更换密码,更换密码的同时把所有 token 过期掉等等来最大程度降低用户损失。
    oauth2.0 是开放用户部分信息给第三方使用的一种三方鉴权协议,一般用作第三方登录这种,可能并不符合你的需求。如果你想看一些比较好的实现,可以参考 github,facebook 之类的。
    wangxiaoer
        3
    wangxiaoer  
       2017-05-06 13:13:42 +08:00
    很奇怪你的需求,不知道你到底是想隐藏请求的参数、请求的内容还是响应的内容?如果是想隐藏请求的数据,我觉得你的需求很奇怪,这些都是明码啊,怎么隐藏?
    至于你说的“比如根据用户名查询用户的信息,https 还是能看到接口请求的内容,别人也能使用这个接口查别人的信息”,更不理解了,难道你们的查询接口不做验证的吗?如果从业务上讲本身就是开放的 api,那还隐藏什么?如果业务上不是对所有人开放的,那就加验证、权限判定啊!
    v1024
        4
    v1024  
       2017-05-06 14:12:34 +08:00 via iPhone
    自己「发明」协议
    sensui7
        5
    sensui7  
       2017-05-06 22:19:15 +08:00
    HttpOnly, Secure 的 jwt token 还怕丢?? 那我看, 还是局域网吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3635 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:44 · PVG 18:44 · LAX 03:44 · JFK 06:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.