【发布时间】:2011-02-16 18:59:09
【问题描述】:
一位同事刚刚让我意识到一个非常奇怪的 MySQL 行为。
假设您有一个表,其中包含一个 auto_increment 字段和另一个设置为唯一字段(例如用户名字段)。当尝试使用表中已经存在的用户名插入一行时,插入失败,正如预期的那样。然而,当您在多次尝试失败后插入有效的新条目时,可以看到 auto_increment 值增加了。
例如,当我们的最后一个条目看起来像这样时......
ID: 10
Username: myname
...我们在下一次插入时尝试五个具有相同用户名值的新条目,我们将创建一个新行,如下所示:
ID: 16
Username: mynewname
虽然这本身不是一个大问题,但正如 MySQL 参考手册所述,通过将失败的插入请求淹没表来杀死表似乎是一个非常愚蠢的攻击向量:
“如果 [...] 值变得大于可以存储在指定整数类型中的最大整数,则未定义自动增量机制的行为。”
这是预期的行为吗?
【问题讨论】:
-
您的攻击媒介似乎不是问题。如果你可以用失败的插入请求来淹没它,你不能同样用非失败的请求来淹没它吗?
-
@martin smith:虽然这是真的,但我认为新用户的突然激增比 auto_increment 的无声增加更为明显,如果不检查它很可能会被淘汰。
标签: mysql innodb auto-increment