应不应该把主键 id 暴露在 url 上?

1 天前
 felix9ia

想请教一下大家是怎么做的?

比如访问一个电商网站的店铺页面的 url:

方式 1:使用自增的主键 id xxx/shop/123

方式 2:使用雪花主键 id 或者 guid

xxx/shop/1881238297653633026

xxx/shop/85d93ea0-3d43-48c5-99ec-e11f54655228

方式 3: 使用业务编号

xxx/shop/st_003

方式 4:

用 sqids 把所有的实体主键 id(private_id) 在转换 VO 时加盐转换成 (public_id) 返回给前端

相关讨论: https://www.reddit.com/r/csharp/comments/rg7xob/is_it_bad_to_expose_primary_key_to_the_user_if/

5998 次点击
所在节点    Web Dev
67 条回复
Rickkkkkkk
1 天前
不是自增的就行
javalaw2010
1 天前
在绝大部分场景下,我推崇方案 1 ,如果有产品端/安全端的特殊需求,我会考虑方案 3 ,只有再极少数场景下,比如日志追踪等,我会考虑 2
javalaw2010
1 天前
@javalaw2010 原贴编辑过了吗?我这里的方案 3 指的是加盐,方案 2 指的是 uuid
laobobo
1 天前
我(前端)做过的功能,后端给几乎都是用的自增 ID ,极少数场景才会用 2 ,其他目前没遇到
felix9ia
1 天前
@javalaw2010 是的,不好意思,我刚刚改了一下。

其实方案 1 的自增有明显的缺陷,不应该被推荐把? 用 sqids 加盐我觉得也是少数场景,比如用户主页这种。
CHTuring
1 天前
2 就够用了,还是像楼上说的,只要不是自增就行了。
felix9ia
1 天前
@laobobo 其实,我的这个问题有场景限制,就是在客户端,而不是后台管理页面。

如果是后台管理,我觉得暴露自增 id 没有关系。
felix9ia
1 天前
方案 4 有一个好处就是,定期更换盐,可以让链接失效,当然让链接失效有好处也有坏处
laobobo
1 天前
@felix9ia 嗯,如果是用户端,个人感觉还是不要暴露自增 id ,总感觉不安全
javalaw2010
1 天前
自增 id 除了暴露数据量之外,其他我也没觉得会有啥缺陷,而“暴露数据量”这件事也只有少数场景下才值得被关注,这些场景下就需要具体问题具体分析,比如订单相关场景,其实订单号比 ID 更像事实上的主键(我个人喜欢在绝大多数场景下都保留自增 ID ),业务上基本使用订单号而非主键。
iyiluo
1 天前
肯定不能用自增,首先安全那关就过不去,可以被黑产猜测到数据,遇到爬虫,直接把你整个业务的数据都扒下来。用 md5, uuid, 雪花都行
anonydmer
1 天前
目前项目都用 ULID
musi
1 天前
暴露自增 id 有什么问题吗?
我没见 v2 有什么安全性问题啊
zpfhbyx
1 天前
数字没问题啊, 只要不是自增就行 足够大 轮训不全的.
felix9ia
1 天前
@musi V2EX 用的是自增 id ?

https://tanronggui.xyz/t/1106781
musi
1 天前
@felix9ia t 后面的不就是帖子 id 么,你加一减一不也能看到其他帖子么
mxT52CRuqR6o5
1 天前
也可以用对称加密算法加个密,不知道密钥的话也破解不了
felix9ia
1 天前
@musi 卧槽,还真是
kingcanfish
1 天前
其实 暴露在 url 上和暴露在接口 json 中没啥区别,不自增就行
飞书一样暴露出来的
hertzry
1 天前
京东这一串应该也是自增。
https://item.jd.com/product/7323507.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1106781

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX