0

こんにちは、アカウント アクティベーション ページを作成しようとしていますが、アカウントをアクティベートしようとすると、2 回に 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);

だからここに私の問題があります:(confirm.phpの5-9行目)なぜこれをしなければならなかったのかわかりません。アカウントを作成するたびに、ユーザーIDが奇数の場合にのみ機能しました。偶数だった場合は、パスワードにドットを追加しました。このようなもの:
userid:1 password:something
userid:2 password:stackoverflow.

そのため、$pass が "$6$10$".$_GET['code'] と一致せず、コード全体が失敗しました。ユーザーIDが0のときにドットが追加される理由がまったくわかりません.ps:confirm.phpの5〜9行目でその問題が解決しました。しかし、なぜそれをしたのか知りたいだけです。

編集: 回答する前に投稿全体をお読みください。

4

1 に答える 1

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 変数をクエリに入れる前にサニタイズします。

于 2012-06-08T11:00:46.787 に答える