【问题标题】:How to avoid incremental ID security gap in mysql如何避免mysql中的增量ID安全漏洞
【发布时间】:2015-09-28 08:19:14
【问题描述】:

什么是安全和性能方面的最佳实践,以避免让用户在数据库或其他数据集中看到增量 ID 的数据。

主要关注的是避免使用诸如

之类的url
www.myweb.com/user/123

这当然适用于帖子、用户、文件或消息。

【问题讨论】:

  • 这确实是个问题,然后 Stack Overflow 必须更改用户的 URL ;)
  • 一个正确构建的系统不会关心用户的黑客网址。他们会在每次请求时在服务器上强制执行安全性,以确认允许用户查看 url。例如用户 124 尝试点击 .../123,他们应该得到“未授权”而不是看到 123 的东西。
  • 只要 URL 后面的资源得到适当保护(例如通过登录),这不是安全问题
  • 如前所述,这并不是真正的安全问题,但可能是业务问题。我想竞争对手可以通过跟踪您的 id 来逆向分析您的业务增长速度。
  • @dpmcmlxvi 是的,在这方面,商业或社交方面比安全更令人不安

标签: mysql security sorting


【解决方案1】:

实施权限,以便只有获得授权的人才能查看/更改/删除数据。

如果您仍想对用户或 API 使用者隐藏增量 ID,您可以在数据库中添加一个哈希列并为其编制索引,然后公开它而不是增量 ID。

【讨论】:

  • 我们之前在另一个帖子中与@kittykittybangbang 讨论过这个解决方案。我提出了这个解决方案,但在大多数情况下它被证明是矫枉过正。不过,出于习惯,我仍然会采用您的解决方案。
【解决方案2】:

隐藏增量 ID

根据您的编程语言,您分配给用户的唯一 ID 可能不需要显示在 URL 中。例如,使用 PHP,您可以使用 $_SESSION[] 数组为每个用户存储值在您的服务器上。用户永远不会看到这些变量,但服务器将能够适当地识别每个用户(通过 PHP cookie)并动态地为他们提供正确的页面。

例如,当用户登录您的网站时,在通过身份验证后,您的脚本可能会执行以下操作:

$sql = 'SELECT id FROM user_table WHERE name = :username';

// Prepare & execute SQL query, putting result in $sqlResult

$_SESSION['user_id'] = $sqlResult;

现在,每当用户想要访问他们自己的页面时,您的服务器都会知道要使用哪些信息来填充您的主页模板,并且该 URL 对每个用户来说都是相同的。

如果用户想要访问另一个用户的页面,您可以执行类似的操作:选择要访问的特定用户页面后,您的脚本可以设置一个$_SESSION['visit_user'] 变量。因此,您将能够使用适当的信息填充访问页面模板,而您的用户将不会更聪明。

同样的策略可以应用于分配了增量 ID 的帖子、文件等。

但这有必要吗?

正如您自己在previous post 中提到的那样,有很多使用增量 ID 的网站示例 - 并且毫不犹豫地显示它们。因为虽然这确实使恶意用户能够查看其他用户的 ID 等,但这并不一定会对您网站的安全构成威胁。如果您遵循基本的安全原则(需要强密码、查看您的 MySQL 用户和文件的权限、清理用户输入等),那么恶意用户是否可以猜测 auto_incremented ID 并不重要。除非您的网站可以通过其他方式被利用,否则这些 ID 不是有价值的信息。

【讨论】:

  • 我同意,这可能更多是社会问题而不是安全问题。假设您有一个 eShop 并逐步识别您的发票。用户知道到目前为止有多少购买并不是一个安全问题,但您可能希望隐藏此统计信息。事实上,我知道一个主要的本地 eShop 就是这样工作的。
  • 这是我没有考虑过的一点:增量 ID 可能会泄露贵公司的统计数据。类似的东西最好保存在$_SESSION[] 变量中。尽管如此,仍然不能依靠这些增量 ID 来准确显示统计信息:有多少 ID 被用作开发中的测试,或者被删除/撤消/修改并充当误报?
  • 现在我仔细考虑了一下,我没有看到模式,有些使用增量 ID(FB、SO)有些不使用(Youtube、Vine、Twitter、9gag)。试图找出原因。
  • Twitter,例如,需要一个唯一的句柄,从而确保如果使用该句柄,您的用户页面 URL 将是唯一的。 SO 需要唯一的用户名——但一个用户可以有多个帖子,因此需要另一种生成唯一 URL 的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 2011-10-16
  • 2011-01-16
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多