繁体   English   中英

PHP的奇怪的错误,如果?

[英]php strange error with if?

你好,我正在尝试创建一个帐户激活页面,但是当我尝试激活一个帐户时,它可以工作两次。 所以基本上我的激活链接使用的用户ID是使用base64_encode()编码的,而用户密码是使用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行)我不明白为什么我必须这样做。 每次我创建一个帐户,只有当用户名是奇数时,它才起作用。 如果是的话,它还会在密码上添加一个圆点。 所以像这样:
用户名:1​​密码:某物
用户名:2密码:stackoverflow。

因此,这就是为什么$ pass不会处理“ $ 6 $ 10 $”。$ _ GET ['code']而整个代码失败的原因。 我完全不知道为什么当我的用户ID为0时为什么要添加点。ps:confirm.php中的5-9行解决了该问题。 但我只想知道为什么会这样。

编辑:请在回答前阅读全文。

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变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM