为了防止数据库条目 ID 直接暴露给用户,该如何设计?

发布于 2022-09-04 08:51:23 字数 453 浏览 16 评论 0

在数据库通过 id 获取相应的条目

select * from obj_table where id = 101;

例如在 web 段,用户会通过 url: "abc.com/p/101" 来获取相应的信息。

这样处理的话有个弊端,爬虫可以很方便的顺着 id 自增的规律来抓取信息,有些时候不想暴露这样的信息。那么后段该如何处理?

例如 segmentfault.com 问题 url 是这样的"https://segmentfault.com/q/1010000007930814"

后面的"1010000007930814"显然不是数据库中相应条目的 id,那么他们之间的转换关系是什么样的?

相关讨论:想到一个自增 id 但是同时防止遍历的办法

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

二智少女猫性小仙女 2022-09-11 08:51:23

可以使用hashids

将数值转化为唯一的且尽可能短 id(注意只是用来转化数值),且有各种语言版本的实现,方便使用。

from hashids import Hashids
hashids = Hashids(salt="this is my salt")
id = hashids.encode(11, 22, 33)  # 'KbiyCL'
numbers = hashids.decode(id)  # (11, 22, 33)
一身骄傲 2022-09-11 08:51:23

其实很有可能是id,不过不是自增的,比如你可以用Murmurhash来生成,看起来毫无规律。

绝影如岚 2022-09-11 08:51:23
可以自己实现一个ID转换方法逻辑 比如;
$id = 20;

$code = ($id+10)*3;

$id = ($code/3)-10;

把code暴露在url当中作为参数, http://www.jd.com/item-2497.html
永远不会泄露数据库ID,也可以再API中防止各种攻击
孤者何惧 2022-09-11 08:51:23

关于SEO

在没有sitemap的情况下,Google、Baidu等爬虫是不会按次序去爬的,它们会按照通过你的首页内容中的的超级链接一层一层的爬下去。
如果你的ID曾经暴露在首页或其他页面,那肯定会被收录的。

那种按照次序爬的引擎,一般是人为手动去做的,比如Python自己写的脚本。
对于不想暴露的,应该是设置权限让游客无法访问,而非找ID对应,不然最终麻烦的是自己。

回答你的问题

对于主键ID,一般使用如下3种类型:

  • int自增量

  • UUID,32位类似MD5的字符串

  • 自己程序生成ID,比如你举例的例子。

因此,它们的主键本身就是这个,而不是有ID的对应的关系,因为这样实在没必要,使用非自增量在MySQL等数据库中,会导致自然存储顺序非常难以预估。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文