0

OKこのコードでメールアカウント確認リンクを送信します

      $verifyemail = $clean['email'];
      $to = $verifyemail;
      $subject = 'Virtual Pierz Close | Verify Your Account';
      $message = "Thanks for registering with VPC, on clicking the verification link       below, your account will be confirmed, you can then go ahead buy Virtual Properties,   donating £5 each time to the worthwhile charity.

      http://www.cambrianvacation.co.uk/vpc/registered.php?
      email='$verifyemail'&hash='$hash1' ";

    $headers = 'From:noreply@cambrianvacation.co.uk'; // Set from headers  
    mail($to, $subject, $message, $headers);

そして、私はこのコードを持っています。これは、データベースでactive = 1を設定することによってアカウントをアクティブ化しようとしています。これは、ログイン時にアクセス制御ロジックの一部になり、active = 1がないと、ログインはありません。

  if(isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['hash']) &&    !empty($_GET['hash'])){  
  // Verify data  


  $accountemail = $_GET['email'];
  $accounthash = $_GET['hash'];
   }
    $accountActive = 1;
    $notactive = 0;
    $username = '';
    $password2 = '';
    $username = 'xxxxxxx';
    $password2 = 'xxxxxxx';

    $db1 = new PDO('mysql:host=localhost;dbname=xxxxxxxxxxxxx', $username,   $password2, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

   $db1->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
   $db1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   try{
   $search = $db1->prepare("SELECT email, hash, active FROM users WHERE email = :email     AND hash= :hash AND active = :active");
   $search->bindParam(':email', $accountemail);
   $search->bindParam(':hash', $accounthash);
   $search->bindParam(':active', $notactive);
   $search->execute();
   $colcount = $search->columnCount();

   }catch(PDOException $e) {
  $e->getMessage();
  } 
       print_r($colcount);
       if($colcount === 3){


      //try{
          $update = $db1->prepare("UPDATE users SET active=:active WHERE email=:email AND hash=:hash AND active = :active");
          $update->bindParam(':active', $accountActive);
          $update->bindParam(':email', $accountemail);
          $update->bindParam(':hash', $accounthash);
          $update->bindParam(':active', $notactive);
          $update->execute();

      //}catch(PDOException $e) {
      // $e->getMessage();
      //} 

ただし、アクティブな列を更新できません。

GET ['email']を使用すると、セマンティックurl攻撃を受ける可能性があることも考えましたが、crypt()でランダムに生成される一致するハッシュがないと、ロジックはアカウントをアクティブ化しません。 ...誰かがコードにセキュリティホールを見つけたら、教えてください.........

4

4 に答える 4

0

ここで2つの別々のクエリを実行する理由は実際にはありません。ハッシュと電子メールに基づいてアクティブ=0でレコードを更新するクエリを1つだけ持っていないのはなぜですか?変更された行の数=1の場合は成功し、そうでない場合は失敗しました。更新が失敗した理由(つまり、悪い電子メール、悪いハッシュ、すでにアクティブなユーザーなど)をユーザーに示すことはセキュリティの観点から悪いので、おそらく失敗した理由は気にしないでしょう。

そうは言っても、実際の問題は、スタイルバインディングを使用しているのに対し、更新で?スタイルバインディングを使用bindParam()しているという事実にあり:paramます。これらの値はプリペアドステートメントに存在しないため、これは機能しません。

したがって、この1つのクエリを使用するだけです。

UPDATE users SET active = 1 WHERE email = :email AND hash = :hash AND active = 0

もちろん、アクティブ/非アクティブの値を変更しようとしている場合は、それらのパラメーターも自由に使用できますが、許容値のみを持つブールスタイルのtinyintフィールドとして扱いたいと思います。 0と1なので、パラメータ化しても意味がありません。

于 2013-02-12T00:16:29.420 に答える
0

更新クエリでは、「?」を使用しています パラメータの場合ですが、bindParam()を使用して名前付きとして設定しようとします。あなたは使用する必要があります

$update->execute(array($accountActive, $accountemail, $accounthash, $notactive));

または、次のように更新クエリを変更します。

$update = $db1->prepare("UPDATE users SET active=:active WHERE email=:email AND hash=:hash");
于 2013-02-12T00:17:02.093 に答える
0

新しいパラメータが正しくバインドされていません。次を変更してください。

$update = $db1->prepare("UPDATE users SET active=? WHERE email=? AND hash=? AND active = ?");

に:

$update = $db1->prepare("UPDATE users SET active=:active WHERE email=:email AND hash=:hash");

編集-完全な更新コード:

      $update = $db1->prepare("UPDATE users SET active=:active WHERE email=:email AND hash=:hash");
      $update->bindParam(':active', $accountActive);
      $update->bindParam(':email', $accountemail);
      $update->bindParam(':hash', $accounthash);
      $update->execute();
于 2013-02-12T00:13:29.830 に答える
0

あなたができることは、「メール」をまったく含まないことです。

これを行うことで、URLの生成を試みることができます。

$secret = "1032940fdjsjdkf#@$!@#%djsfisd";
$hash = md5($email.$secret);
$url = "http://www.cambrianvacation.co.uk/vpc/registered.php?hash=".$hash;
于 2013-02-12T00:15:24.117 に答える