用 shortuuid 生成 userid、文章 id 来防止遍历,有比这个更好的方案吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
find456789
V2EX    问与答

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

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

    数据库 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     Solana     2712 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 12:03 PVG 20:03 LAX 05:03 JFK 08:03
    Do have faith in what you're doing.
    ubao 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