您好我正在尝试创建一个帐户激活页面,但是当我尝试激活一个帐户时,它会在两次中使用1次。所以基本上我的激活链接使用用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);
所以这就是我的问题:(确认.php中的第5-9行)我不明白为什么我必须这样做。
每次我创建一个帐户,它只有在用户ID是奇数时才有用。如果它甚至在密码上添加了一个点。
所以这样的事情:
userid:1个密码:东西
userid:2密码:stackoverflow。
这就是为什么$ pass没有“$ 6 $ 10 $”。$ _ GET ['code']并且整个代码都失败了。我完全不知道为什么在我的用户标识为0时添加点。 ps:confirm.php中的第5-9行解决了这个问题。但我只是想知道为什么会这样做。
编辑:请在回答之前阅读整篇文章。
答案 0 :(得分:0)
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变量。