2

这可能是一个重复的问题,但我真的找不到任何答案。我有一个忘记密码的脚本,它使用 $_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 是否必须是整数,或者我可以将其作为字符串处理吗?

编辑:感谢您的所有意见和建议。php还有很多东西要学。再次欢呼。

4

4 回答 4

3

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

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

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

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

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

于 2013-05-28T15:16:59.700 回答
1

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

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

于 2013-05-28T15:13:00.193 回答
1

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

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

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

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

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

于 2013-05-28T15:13:50.677 回答
0

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

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

于 2013-05-28T15:11:28.100 回答