2016-09-26 3 views
1

Так что я в настоящее время изучаю PHP, и я создаю простую страницу PHP с формой регистрации, используя метод POST. В форме submit страница хеширует пароль (с помощью phpass), проверяет, что имя пользователя является допустимым (то есть оно не существует в настоящее время в db) и вставляет, если это правда. Мой код вставляет новые строки, но я не вижу значений для имени пользователя или хэш-значений, которые хранятся. Вот PHP:Вставить в базу данных MySQL через PHP только половину работы

require("PasswordHash.php"); 
$unSuccess = false; 
$pwSuccess = false; 
$registerSuccess = false; 
$spamSuccess = false; 

$database = "XXXXXXX"; 
$username = "XXXXXXX"; 
$password = "XXXXXXX"; 
$server = "XXXXXXX"; 
$db = new mysqli($server, $username, $password, $database); 

$user = ""; 
$pass = ""; 


if (mysqli_connect_errno()) 
    { 
     printf("Connection failed: %s\n", mysqli_connect_error()); 
     exit(); 
    }   


if($_POST["usr"] && !$unSuccess){ 
    $un = $_POST["usr"]; 

    if(strlen($un) < 20){ 
     //Verify Username is valid 
     if(preg_match("/([A-Za-z0-9])/", $un) == 1){ 
      //Username is valid, check if it already exists in db. 
      $unCheckQuery = "SELECT USERS.Username FROM USERS WHERE USERS.Username = '$un'"; 
      $result = $db->query($unCheckQuery); 
      $num = $result->num_rows; 
      $result->close(); 
      if($num != 0){ $errUsername = "Username already exists."; $unSuccess = false; } 
     } 
     else{ 
      //Username is valid and not taken 
      $user = $un; 
      $unSuccess = true; 
     } 
    } 
} 


if($_POST["password"] && !$pwSuccess){ 
    //verify and hash pw 
    $pw = $_POST["password"]; 
    if(str_len($pw) > 72){die("Password must be shorter than 72 characters");} 
    $hasher = new PasswordHash(8, false); 
    $hash = $hasher->HashPassword($pw); 
    if(strlen($hash) >= 20 && preg_match($pattern, $pw) == 1){ 
     $pass = $hash; 
     echo $pass; 
     $pwSuccess = true; 
    } 
    else{ 
     $pwSuccess = false; 
    } 
} 
if($_POST["spam"]){ 
    $s = $_POST["spam"]; 
    if($s != 10){ 
     $spamSuccess = false; 
    } 
    else if($s == 10) {$spamSuccess = true;} 
} 

if($unSuccess = true && $pwSuccess = true && $spamSuccess = true){ 
    $registerQuery = "INSERT INTO USERS(Username, phash) VALUES('$user', '$pass')"; 
    //This line is breaking evrything. 
    $db->query($registerQuery); 

} 

Форма, которую я использую, представляет собой простую форму HTML. По очевидным причинам я пропустил регистрационную информацию. Любые указатели в правильном направлении были бы очень признательны!

+2

'$ unSuccess = true' присваивает, а не сравнивает. –

+0

Возможно, вы захотите дважды проверить логин «валидация». Оба предложения 'if' и' else' говорят: // Имя пользователя действительно, поэтому вы можете смутить себя тем, что на самом деле происходит там. Кроме того, вы видите хешированный пароль, отображаемый на вашем выходе в результате «echo $ pass;»? –

+0

Что такое 'str_len'? Что такое '$ pattern'? Вы проверяли значения '$ user',' $ pass' перед тем, как запросить? Они определенно пусты. –

ответ

0
if($unSuccess = true && $pwSuccess = true && $spamSuccess = true) 

должен быть

if($unSuccess == true && $pwSuccess == true && $spamSuccess == true) 
+0

Это правда, но это не вызывает никаких ошибок. –

+1

Вы всегда можете отбросить часть '== true', если ваши значения верны *. – tadman

0

Оказывается, именно этот вопрос был быть вызвана проблемой безопасности на стороне сервера. Этот код является синтаксически правильным.