2011-01-12 4 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

@ 브래드 나는이 방법이 안전한지 확인하고 싶다. @ 페카지만 성별은 드롭 다운 메뉴를 사용하여 선택되므로 문제가 아닌 것 같습니까? 또는 자바 스크립트 삽입을 사용하여 값을 변경할 수 있습니까? –

답변

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 (serialize ($ _POST는 $ _POST가 될 것입니다))와 some_other_stuff ...와 같은 것이어야합니다. noob –

+0

당신이 그것을 위해 해시를 사용하고자하는지 모르겠지만, 여러 사람에 대해 동일한 해시를 생성하는 것은 좋은 생각이 아니므로, 해시를 만드는 데 더 나은 데이터 소스를 사용해야합니다. 따라서 serialize $ _POSt 배열에서 그 배열을 평문 문자열로 변환하고 해시 할 수 있습니다. $ some_other_stuff는 더 많은 데이터를 문자열에 추가하여 소스 데이터를 무작위로 랜덤 화합니다. –

+0

해시를 사용하여 전자 메일, 그래서 예를 들어 $ hash = md5 (serialize ($ _ POST [ 'password'])와 같은 것을 사용할 수 있습니까? –