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

用 shortuuid 生成 userid、文章 id 来防止遍历,有比这个更好的方案吗?

  •  
  •   find456789 · 2018-02-17 19:00:09 +08:00 · 4141 次点击
    这是一个创建于 2232 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数据库 mysql

    目前数据库有个自增的数字 id, 但容易被遍历,

    出于防止被对手看出动向 等原因

    打算在前台输出 userid 和文章 id 的时候, 进行加密

    目前打算 保留系统自带的 数字 id, 再额外增加一个 shortuuid 生成的字段,展现给前台用户

    https://github.com/skorokithakis/shortuuid

    大家觉得这个方案如何?

    有没有更好的方案

    比较追求性能、扩展性、安全性、性价比

    13 条回复    2018-02-18 18:52:20 +08:00
    crysislinux
        1
    crysislinux  
       2018-02-17 19:16:38 +08:00   ❤️ 1
    可以只用 slug,禁止 id 直接访问。
    night98
        2
    night98  
       2018-02-17 19:19:22 +08:00 via Android   ❤️ 1
    文章 id+uuid 的 sha1 值也可以,同时保存在数据库即可。
    MiffyLiye
        3
    MiffyLiye  
       2018-02-17 19:23:14 +08:00   ❤️ 1
    无序的 uuid 对数据库索引不友好,可以试试趋势有序的 snowflake
    https://github.com/MiffyLiye/Snowflake
    find456789
        4
    find456789  
    OP
       2018-02-17 19:45:45 +08:00
    @crysislinux

    请问 slug 是什么
    find456789
        5
    find456789  
    OP
       2018-02-17 19:56:34 +08:00
    @MiffyLiye

    谢谢, 好像用 snowflake 需要额外一台服务器哦
    geelaw
        6
    geelaw  
       2018-02-17 20:07:51 +08:00   ❤️ 1
    阻止遍历的最简单想法是这样做:使用自增的 id,并在 URL 上附加一个对该 id 的数字签名。
    MiffyLiye
        7
    MiffyLiye  
       2018-02-17 20:12:52 +08:00   ❤️ 1
    @find456789 可以分布式使用,我已经用上了其实。有其他问题,但是大部分问题在低频率创建(<4096 requests per 100 ms )时不太会遇到。
    https://bitbucket.org/MiffyLiye/miffy/src
    以上 repo 公开 24 小时
    tscat
        8
    tscat  
       2018-02-17 20:44:46 +08:00 via Android   ❤️ 1
    可以做蜜罐吧。部分 id 不对外公开,一旦访问直接 ban ip。
    lyc9308
        9
    lyc9308  
       2018-02-17 20:46:41 +08:00 via Android   ❤️ 1
    对 id 做一下编码成本也很低啊
    ryd994
        10
    ryd994  
       2018-02-17 22:38:06 +08:00 via Android   ❤️ 1
    @MiffyLiye 1. 随机字段索引影响不大,大的是随机主键
    2. 就算是随机主键,新的数据库都已经有了相当的优化,或者提供了适合作为主键的随机函数

    简单办法就是加上过期时间并签名。防顺序遍历够了。
    msg7086
        11
    msg7086  
       2018-02-18 03:10:02 +08:00   ❤️ 1
    #4 @find456789


    一般我觉得对 id 做编码就行了,映射到非连续空间,也不会影响性能。
    imzoke
        12
    imzoke  
       2018-02-18 04:08:03 +08:00 via Android   ❤️ 3
    使用 hashids 吧
    http://hashids.org
    honeycomb
        13
    honeycomb  
       2018-02-18 18:52:20 +08:00 via Android   ❤️ 1
    @find456789
    snowflake,或者你按照它的原理写个变形。
    如果是 hibernate/jpa,直接把它作为 generator 就可以。

    不过 snowflake 这种 ID 生成方式会携带明确且准确的时间戳,不一定适用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2855 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 14:27 · PVG 22:27 · LAX 07:27 · JFK 10:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.