【问题标题】:php strange error with if?php奇怪的错误与if?
【发布时间】:2012-06-12 10:11:58
【问题描述】:

您好,我正在尝试创建一个帐户激活页面,但是当我尝试激活一个帐户时,它会工作两次。所以基本上我的激活链接使用用base64_encode()编码的用户ID和用crypt(sha512)编码的用户传递。所以我在注册页面上的代码如下所示:

    $qry = "SELECT * FROM users WHERE username='$username'"; 
    $res = mysql_query($qry);
    $row = mysql_fetch_row($res);
    $userid=$row[0];//gets the id of the user
    $userpass=$row[2];//gets the pass from database (which is already encoded)
    $userid=base64_encode($userid); //encodes userid
    $code=substr($userpass,6,strlen($userpass)-6); // cuts off some $6$xx$ information which is needed for crypt.
    $message="//here is some message and then the link 
    http://www.xxx.be/forum/confirm.php?userid=".$userid."&code=".$code;

    mail($email , "xxx registration confirmation" ,$message,"From:NoReply@xxx.be");

这是我在 confirm.php 中使用的代码:

$userid=base64_decode($_GET['userid']); 
$qry = "SELECT * FROM users WHERE id='$userid'"; 
$res = mysql_query($qry);
$row = mysql_fetch_row($res);
if ($userid%2==0) {
$pass=substr($row[2],0,strlen($row[2])-1);
} else {
$pass=$row[2];
}
if ($pass=="$6$10$".$_GET['code']) {
$qry = "UPDATE users SET activated=1
WHERE id=$userid"; 
$res = mysql_query($qry);

所以我的问题来了:(confirm.php 中的第 5-9 行)我不明白为什么我必须这样做。 每次我创建一个帐户时,它只在用户 ID 为奇数时才有效。如果它甚至在密码中添加了一个点。 所以是这样的:
用户名:1​​ 密码:某事
用户名:2 密码:stackoverflow。

这就是为什么 $pass 没有匹配 "$6$10$".$_GET['code'] 并且整个代码失败的原因。我完全不知道为什么当我的用户 ID 为 0 时它会添加点。 ps:confirm.php 中的第 5-9 行解决了这个问题。但我只想知道为什么会这样。

编辑:请在回答前阅读整篇文章。

【问题讨论】:

  • 您的代码易受 SQL 注入攻击。请不要使用旧的 mysql_* 函数,并切换到 MySQLi 或 PDO 中的参数化查询。
  • “所以我的问题来了:[...] 每次我创建一个帐户时,它只有在用户 ID 为奇数时才有效。如果是偶数,它会在密码中添加一个点。” 然后显示存储用户的代码。
  • 那么,if ($userid%2==0) 的意图是什么?我不太明白您在那里尝试做什么,但这很可能是您的奇数/偶数用户 ID 问题的根源。
  • 不,不是问题,而是解决方案....如果我删除它,它就不再起作用了,我不明白为什么
  • $qry = "INSERT INTO users(username, password,email) VALUES('$username','$password','$email')"; $result = @mysql_query($qry);

标签: php activation


【解决方案1】:
if ($userid%2==0) {
    $pass=substr($row[2],0,strlen($row[2])-1);
} else {
    $pass=$row[2];
}

这条语句没有用,它正在破坏你的代码。如果 userid == 偶数,那么它会从 $row[2] 字符串中截断最后一个字符。

要修复,您可以删除 if 语句并拥有

$pass = $row[2];

另外,正如有人评论的那样,您应该考虑使用准备好的语句来防止 SQL 注入。或者至少至少在将您使用的 $_GET 变量放入查询之前对其进行清理。

【讨论】:

  • 嗯,这就是我的整个帖子的内容。如果我删除这些代码,那么它会在密码中添加一个点,以防万一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2011-07-23
相关资源
最近更新 更多