这可能是一个重复的问题,但我真的找不到任何答案。我有一个忘记的密码脚本,它使用$ _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中还有很多东西需要学习。再次干杯。
答案 0 :(得分:3)
用户ID不必是整数,但通常是
因此,理想情况下,这将是一个整数(该位数必须覆盖最大数量的预期用户)
缺点之一是如果将整数提供给客户端浏览器(例如,以表格形式),则客户端可能猜测用户的数量/更改表单用户ID,因为序列中的数字可以很容易猜到... (需要通过进一步的安全措施来防止)
答案 1 :(得分:1)
你从$ _GET数组中提取的所有东西都将成为一个字符串,因为没有通过http发送的类型信息。
但是,您应始终清理用户输入或使用预准备语句来防止SQL注入攻击。
答案 2 :(得分:1)
你搞砸了,我会尽力澄清它们。当PHP通过HTTP协议接收数据时,无论是GET还是POST - 所有数据都被认为是一个字符串,因为无法安全地识别数据应该是什么。
这意味着您可以尝试使用类型转换(例如$id = (int)$_GET['id'];
对于数据库,id(让我们称之为Primary Key
)应该始终是一个整数。
为什么:
- 当涉及到实际的数据结构组织并将信息写入磁盘时,InnoDB在内部使用某种原则。它通过使用顺序递增的整数来实现显着的性能增益
- 使用整数创建唯一标识符很容易。只需在每次插入时将一些数字增加一个偏移量,并获得分配给该行的唯一编号,无需使用复杂的算法来计算UUID()
等唯一标识符。
长话短说 - 在MySQL中将用户的ID保持为整数,如果通过$ _POST / $ _ GET接收数据 - 请将类型转换为您想要的数据(int,float,string等)。
答案 3 :(得分:0)
用户ID可以是您想要的任何内容......我只建议它是数据库中具有唯一键的东西,并且不会随时间而变化。
传统上使用的是ID,因为最好在您的表上使用自动递增的主键,并且它符合所有条件,才能成为有效的用户ID。