用户ID必须是整数吗?

时间:2013-05-28 15:04:42

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

这可能是一个重复的问题,但我真的找不到任何答案。我有一个忘记的密码脚本,它使用$ _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>';
 }

就像我之前说的那样,剧本本身很好,只是我读了一些东西而现在无法理解它,这导致我问你们。 Doe的用户ID必须是一个整数,还是我可以把它作为一个字符串来逃脱?

编辑:感谢您的所有意见和建议。在php中还有很多东西需要学习。再次干杯。

4 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

这意味着您可以尝试使用类型转换(例如$id = (int)$_GET['id'];

将内部使用$ _GET或$ _POST的数据强制转换为其他类型

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

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

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

答案 3 :(得分:0)

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

传统上使用的是ID,因为最好在您的表上使用自动递增的主键,并且它符合所有条件,才能成为有效的用户ID。