【问题标题】:Does a user id have to be an integer?用户 ID 必须是整数吗?
【发布时间】:2013-05-23 14:55:02
【问题描述】:

这可能是一个重复的问题,但我真的找不到任何答案。我有一个忘记密码的脚本,它使用 $_GET 从 URL 中获取用户的电子邮件地址。该脚本然后检查 $_GET 是否有错误消息,然后传递给 mysql 以检查用户 ID 是否相同。

现在脚本本身没问题,但用户 id 在 var_dump() 中以字符串而不是整数的形式返回。我本来打算放手的,但后来我读到如果用户 id 不是 $_GET 变量中的整数,它可能会导致攻击,这让我有点担心。我试图将 num_rows 值更改为 int 但没有成功,因为 num_rows 返回一个数组。检查用户ID的代码是:

if (mysql_num_rows($result) == 1) {
    // NEED TO TURN THIS ARRAY TO AN INT
     list($userId) = mysql_fetch_array($result, MYSQL_NUM);  
}

//elseif (mysql_num_rows($result) <= 0) {
else {
    $wrong = '<p style="color: red">Something went wrong. Please try again</p>';
 }

就像我之前说的剧本本身很好,只是我读了一些东西,现在无法摆脱它,这导致我问你们。用户 ID 是否必须是整数,或者我可以将其作为字符串处理吗?

编辑:感谢您的所有 cmets 和建议。 php还有很多东西要学。再次干杯。

【问题讨论】:

  • 如果你的脚本需要一个整数,你应该验证输入是一个整数。 $_GET 中的值将是字符串,但您可以使用 is_numeric 检查它们并使用 (int) 转换它们。
  • 你从 URL 中获取的东西应该是一个 int。如果它是一个字符串,那就是一个漏洞。当您从数据库中检索 ID 时,该值可以是字符串,只要您信任数据库的内容即可。
  • 你在哪里做查询?你能和我们分享一下这段代码吗?

标签: php mysql get integer mysql-num-rows


【解决方案1】:

用户 ID 不必是整数,但通常是

  • 唯一(每个用户一个)
  • 格式化了一种可以在数据库中高效搜索的方式(例如)
  • 简短,因此不会占用太多空间,尤其是对于大型用户银行

因此,理想情况下,这将是一个整数(位数必须涵盖最大数量的预期用户)

  • 唯一 - 例如由数据库自动(增量)分配
  • 高效索引,并且是指向更大用户表的小指针

其中一个缺点是,如果将整数提供给客户端浏览器(例如,在表单中),客户端可能会猜测用户数/更改表单用户 ID,因为序列中的数字很容易猜到... (需要通过进一步的安全措施来防止)

【讨论】:

    【解决方案2】:

    您从 $_GET 数组中提取的所有内容都将是一个字符串,因为没有通过 http 发送类型信息。

    但是,您应该始终清理用户输入或使用准备好的语句来防止 SQL 注入攻击。

    【讨论】:

      【解决方案3】:

      你把事情搞混了,我会试着澄清一下。当 PHP 通过 HTTP 协议接收数据时,无论是 GET 还是 POST - 所有数据都被认为是一个字符串,因为没有办法安全地识别数据应该是什么。

      这意味着您可以尝试将通过 $_GET 或 $_POST 获得的数据在内部强制转换为不同的类型,使用类型转换,例如 $id = (int)$_GET['id'];

      对于数据库,id(我们称之为Primary Key)应该总是一个整数。

      为什么: - 当涉及到实际的数据结构组织和将信息写入磁盘时,InnoDB 在内部使用了一定的原则。它通过使用顺序递增的整数来实现显着的性能提升 - 使用整数创建唯一标识符很容易。每次插入时只需将某个数字增加一个偏移量,您就会获得分配给该行的唯一编号,无需复杂的算法来计算唯一标识符,例如 UUID() 等。

      长话短说 - 在 MySQL 中将用户 ID 保留为整数,如果您通过 $_POST/$_GET 接收数据 - 将它们类型转换为您想要的类型(int、float、string 等)

      【讨论】:

        【解决方案4】:

        用户 ID 可以是您想要的任何东西......我只建议它是在数据库中具有唯一键并且不会随时间变化的东西。

        传统上使用 ID 是因为在您的表上拥有一个自动递增的主键是一种很好的做法,并且它满足成为有效用户 ID 的所有条件。

        【讨论】:

        • 这不是好习惯,原因其实已经很清楚了。
        • @N.B.也许分享说明这些原因的链接会有所帮助。
        • @Jack - 如果我有这样一个链接可以解释所有原因,我会立即提供,但不幸的是我没有
        • @N.B.对于这个用例,我同意应该使用自动递增 ID,但在某些用例中,向表中添加 ID 会增加开销和抽象,但仅此而已。
        • 如果我们谈论 innodb,那么在表中添加 auto_increment 不会增加开销,这是事实。它与它在内部的工作方式以及它如何组织保存索引的 b 树有关。如果您自己不指定一个,它将创建一个隐藏的 bigint,因此您最终将花费 8 个字节而不是通常的 4 个。如果您没有将整数指定为 PK,而是一个字符串,那么您'在插入记录和调试为什么它这么慢时,这很有趣。
        猜你喜欢
        • 2012-03-16
        • 2019-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多