php - 在 url 中隐藏真实的数据库对象 ID

标签 php mysql security hash url-rewriting

出于安全目的,在 URL 中隐藏真实数据库对象 ID 的有用解决方案是什么?我发现其中一种解决方案是:

1) 使用 hashids open source project

2) 在创建对象时使用类似旧 md5 的东西来生成哈希并将其存储在数据库中,然后在 url 中使用它并通过它们进行查询,但缺点是通过自动递增的主键 (ID) 进行查询比哈希更快。所以我相信散列/取消散列的可能性会更好?

此外,由于我使用的是 Symfony,是否有我找不到的捆绑软件或内置的有用功能?

请根据您的经验告诉我您认为有用的内容。

最佳答案

这个问题已经被问过很多次了,用不同的词选择(这使得很难说,“只是搜索它!”)。这一事实促成了一篇题为 The Comprehensive Guide to URL Parameter Encryption in PHP 的博文。 .

人们想在这里做什么

Some encryption function is used to deterministically retrieve the ID

人们应该做什么

Use a separate column

说明

通常,人们想要简短 随机的 URL。这不允许您有太多空间来 encrypt then authenticate您希望混淆的数据库记录 ID。这样做需要至少 32 个字节的 URL 长度(对于 HMAC-SHA256),在以 base64 编码时为 44 个字符。

一个更简单的策略是生成一个随机字符串(参见 random_compatrandom_bytes()random_int() 生成这些字符串的 PHP5 实现)和引用该列代替。

此外,hashids are broken通过简单的密码分析。他们的结论是:

The attack I have described is significantly better than a brute force attack, so from a cryptographic stand point the algorithm is considered to be broken, it is quite easy to recover the salt; making it possible for an attacker to run the encoding in either direction and invalidates property 2 for an ideal hash function.

不要依赖它。

关于php - 在 url 中隐藏真实的数据库对象 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32795998/

相关文章:

php - Mysql - 处理供应商/地点对表的最有效方式

php - Symfony2 ManyToMany 嵌入表单意外结果

php - cakephp - 如何构造此查询

mysql - 无法让简单的 mysql 函数工作

php - 在 mysql/php 中每小时批量显示 100 个海量数据

security - 在启用 SSL 的网站上使用 JWT 代替 Cookie

PHP Magic 比简单地设置类属性更快?

php - 部署 WAMP -> 实时站点 - 任何随机提示?

javascript - 将 ajax 请求更改为不同的 php 文件漏洞,潜在漏洞利用说明

javascript - 使用 Laravel 测试时是否启用了 JS?