2011-01-12 13 views
0

私はこのサインアップスクリプトを持っており、mysql_real_escape_stringを使用しています。準備されたステートメントは安全ですが、私はそれらを使用するのに十分な経験はありません。 。とにかく、ここでスクリプトは次のとおりです。クエリが失敗した場合にスクリプトが出てdie()ますようスクリプトのセキュリティチェックに登録

<?php 

    $username=mysql_real_escape_string($_POST['username']); 
    $password=sha1($_POST['password']); 
    $password2=sha1($_POST['password_confirmation']); 
    $passcheck=$_POST['password']; 
    $todo=mysql_real_escape_string($_POST['todo']); 
    $email=mysql_real_escape_string($_POST['email']); 
    $fname=mysql_real_escape_string($_POST['fname']); 
    $lname=mysql_real_escape_string($_POST['lname']); 
    $gender=$_POST['gender']; 
    $class=$_POST['class']; 
    $section=$_POST['section']; 



if(isset($todo) and $todo=="post"){ 

    $status = "OK"; 
    $msg=""; 
    } 

if(!isset($username) OR strlen($username) <3){ 
    $msg=$msg."Username should be equal to or more than 3 characters long.<BR/>"; 
    $status= "NOTOK"; 
    }     

if(mysql_num_rows(mysql_query("SELECT username FROM users WHERE username = '$username'"))){ 
$msg=$msg."Username already exists. Please try another one.<BR/>"; 
$status= "NOTOK"; 
} 

if(mysql_num_rows(mysql_query("SELECT email FROM users WHERE email = '$email'"))){ 
$msg=$msg."E-mail is already in use. Please try again.<BR/>"; 
$status= "NOTOK"; 
}          


if (strlen($passcheck) < 3){ 
    $msg=$msg."Password must be more than 3 charactors long.<BR/>"; 
    $status= "NOTOK"; 
    }     

if ($password <> $password2){ 
    $msg=$msg."Passwords are not identical.<BR/>"; 
    $status= "NOTOK"; 
    }     
if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)){ 
    $msg=$msg."The email is not a valid email.<br/>"; 
    $status="NOTOK"; 
    } 

if($status=="NOTOK"){ 
    echo '<div class="statusmsg">'.$msg.'<br/><input class="submitButton" type="button" value="Retry" onClick="location.href='."'signup.php'\"></div>"; 
} 
    else { 
     $hash = md5(rand(0,1000)); 
     $hash = mysql_real_escape_string($hash); 
if(mysql_query("insert into users(username,password,email,fname,lname,hash,gender,class,section) values('$username','$password','$email','$fname','$lname','$hash','$gender','$class','$section')")or die (mysql_error())){ 
    echo '<div class="statusmsg">Welcome, You have successfully signed up. Please check the verification e-mail sent to you.</div>'; 
    $to = $email; 
    $subject = 'Signup | Verification'; 
    $message = ' 

     Thanks for signing up! 
      Your account has been created, you can login with the following credentials after you have activated your account by pressing the url below. 

      ------------------------ 
      Username: '.$username.' 
     ------------------------ 

     Please click this link to activate your account: 
    <div id="header"> 
     <h3>JMToday > Sign up</h3> 
    </div>   
     http://www.JMtoday.com/verification.php?email='.$email.'&hash='.$hash.' 

    '; 

    $headers = 'From:[email protected]' . "\r\n"; 
    mail($to, $subject, $message, $headers); 
    } 
else { 
echo "Database problem, please contact site admin"; 
} 

} 
?> 
+0

「ジェンダー」などのすべての値にエスケープを適用する必要があります –

+2

質問がありますか?アーカイブを投稿するだけですか? –

+0

@ブラッド私はちょうどこのメソッドが安全であることを確認したいです。 @Pekkaだが、ジェンダーはドロップダウンメニューを使って選択されるので、問題はないと思う?または、JavaScriptの注入を使用して値を変更することは可能ですか? –

答えて

0

ユーザーは、「データベースの問題」メッセージを見ることはありません。同様に、メッセージにHTMLを埋め込んでいますが、適切なHTML形式のメールを作成していません。一部のメールクライアントは、HTMLがあり、それをレンダリングするのに十分なほどスマートになるかもしれませんが、それは運が単なるものです。

生成するハッシュは、1001個のハッシュの生成に限定されています。誕生日のパラドックスを考えると、38人がサインアップした後、衝突の確率は50%です。 100人後、確率は99.29%です。乱数をハッシュするのではなく、次のようにしてください:

$hash = md5(serialize($_POST) . $some_other_stuff_in_case_POST_is_empty); 
+0

私はそれを取得しないので、$ hash = md5(シリアル化(何をここに行く必要があります、$ _POST?)とsome_other_stuffと何かのようなものでなければなりません... noob –

+0

私はあなたがそれにハッシュを使用したいのか分からないが、複数の人々のために同じハッシュを生成することは間違いないので、ハッシュを構築するためのより良いデータソースを使用しなければならない。 $ _POSt配列では、配列を平文文字列に変換してハッシュすることができます。$ some_other_stuffは、文字列にさらにデータを追加して、ソースデータをさらにランダム化します。 –

+0

ハッシュを使って検証しますメールを確認するのに$ hash = md5(serialize($ _ POST ['password'])のようなものを使用できますか? –

関連する問題