2015-08-29 3 views
-2

Я хочу сделать следующую форму более безопасной, используя bcrypt или что-то в этом роде.Защитите мою регистрационную форму

Я новичок в PHP, поэтому принимайте это медленно и не ожидайте, что я пойму «не использую ..., используйте ....» без объяснения причин.

Futhermore, я искал в Google для некоторых форм учебных пособий, но ничего не нашел с шифрованием, как Bcrypt, hash256/512 и т.д.

<?php 
error_reporting(E_ALL | E_STRICT); 
ini_set('display_startup_errors',1); 
ini_set('display_errors',1); 
require_once 'database.php'; 

    $Username = $_POST['username']; #Username 
    $Password = $_POST['password']; #Password 
    $Password2 = $_POST['password2'];#Password 

if(empty(Password2)){ 
    echo "Please enter a valid confirmation password."; 
    $msg .=" Please enter a valid confirmation password."; 
    echo 
      "<script> 
      alert('$msg'); 
      window.location.href='../register.html'; 
      </script>"; 
      exit; 
} 

if($Password !== Password2){ 
     echo "Sorry, passwords do not match!"; 
     $msgPass = "Sorry, passwords do not match!"; 
     echo 
      "<script> 
      alert('$msgPass'); 
      window.location.href='../register.html'; 
      </script>"; 
      exit; 
} 



function NewUser() 
{ 
    global $Username,$Password; 
    #Egxwrish stoixeiwn 
    $query = "INSERT INTO users (username,password) VALUES ('$Username','$Password')"; 
    $data = mysql_query ($query) or die(mysql_error()); 
    if($data) 
    { 
     return "YOUR REGISTRATION IS COMPLETED..."; 
    } 
} 

function SignUp() 
{ 
    global $Username,$Password; 
    if(!empty($Username)) //checking the 'username' name which is from register.html, if is it empty or have some text 
     { 
       $query = mysql_query("SELECT * FROM users WHERE username = '$Username'"); 

      if(!$row = mysql_fetch_array($query)) 
      { 
       $msg = NewUser(); 
       echo $msg; 
      } 
      else { 
       echo "SORRY...YOU ARE ALREADY REGISTERED USER...!"; 
       die(mysql_error()); 
      } 

     } 
} 

if(isset($_POST['submit'])) 
{ 
    //User registration 
    SignUp(); 
    echo "Your account has been created successfully. \\n Thank you for joined us!"; 
    $msgSuccess = "Your account has been created successfully. \\n Thank you for joined us!"; 
     echo 
      "<script> 
      alert('$msgSuccess'); 
      window.location.href='../index.php'; 
      </script>"; 

} 
?> 
+0

Я не знаю, как вы не нашли ничего надежного. Вот официальная документация password_hash(), если вы не знали об этом. http://php.net/manual/en/function.password-hash.php –

ответ

0

Вы все еще используете устаревшую MySQL. Вместо этого используйте MySQLi или PDO. Если вам нужно это супер безопасно, рассмотрите ниже. Если вы считаете это жестким (его нет, но все же, если вы сталкиваетесь с трудностями в понимании этого), сначала прочитайте некоторые основы PDO или MySQLi. Рассмотрим также PHP 5.5 или новее.

http://php.net/manual/en/book.pdo.php

http://php.net/manual/en/book.mysqli.php

<?php 
// require_once 'database.php'; Consider PDO in your database.php like below 

    $pdo = new PDO('mysql:dbhost=dbhost;dbname=dbname', 'dbuser', 'dbpass'); // Provide your own credentials 

    $Username = $_POST['username']; #Username 
    $Password = $_POST['password']; #Password 
    $Password2 = $_POST['password2'];#Password 

if(empty(Password2)){ 
    echo "Please enter a valid confirmation password."; 
    $msg .=" Please enter a valid confirmation password."; 
    echo 
      "<script> 
      alert('$msg'); 
      window.location.href='../register.html'; 
      </script>"; 
      exit; 
} 

if($Password !== $Password2){ 
     echo "Sorry, passwords do not match!"; 
     $msgPass = "Sorry, passwords do not match!"; 
     echo 
      "<script> 
      alert('$msgPass'); 
      window.location.href='../register.html'; 
      </script>"; 
      exit; 
} 



function NewUser() 
{ 
    global $Username,$Password; 
    #Egxwrish stoixeiwn 
    $hashed_pass = PASSWORD_HASH($Password, PASSWORD_DEFAULT); 
    $query = "INSERT INTO users (username,password) VALUES (:username, :password)"; 
    $data = $pdo->prepare($query); 
    $data->execute(array(':username'=>$Username, ':password'=>$hashed_pass)); 
    if($data->rowCount() > 0) 
    { 
     return "YOUR REGISTRATION IS COMPLETED..."; 
    } 
} 

function SignUp() 
{ 
    global $Username,$Password; 
    if(!empty($Username)) //checking the 'username' name which is from register.html, if is it empty or have some text 
     { 
       $query = ("SELECT * FROM users WHERE username = :username"); 
       $query = $pdo->prepare($query); 
       $query->execute(array(':username'=>$Username)); 
       if($query->rowCount() == 0) 
      { 
       $msg = NewUser(); 
       echo $msg; 
      } 
      else { 
       echo "SORRY...YOU ARE ALREADY REGISTERED USER...!"; 
       die(); 
      } 

     } 
} 

if(isset($_POST['submit'])) 
{ 
    //User registration 
    SignUp(); 
    echo "Your account has been created successfully. \\n Thank you for joined us!"; 
    $msgSuccess = "Your account has been created successfully. \\n Thank you for joined us!"; 
     echo 
      "<script> 
      alert('$msgSuccess'); 
      window.location.href='../index.php'; 
      </script>"; 

} 
?> 
+0

Я уже конвертирую базу данных в mysqli. Должен ли оставаться с mysqli или использовать PDO? Между прочим, возможно лучший собеседник, который кто-то может мне дать! Код ниже, но я получаю пустую страницу:/ Ссылка: http://pastebin.com/9EP6bWfR – ulb

+0

Это зависит от вашего собственного выбора. И MySQLi, и PDO действительны. Используйте подготовленные заявления для запросов db. Что касается пустой страницы, причиной этого может быть сочетание разных типов кодирования. Выберите один и пойдите для него. Либо MySQLi, либо PDO. – Rehmat

0

Вы позволяете пользователям знать, что кто-то другой уже зарегистрирован. Это называется перечислением пользователей. В зависимости от вашего бизнеса это может быть уязвимостью.

Лучше спросить только адрес электронной почты. Если в вашем db есть электронная почта, отправьте им электронное письмо, в котором говорится: «Эй, кто-то пытается зарегистрироваться по электронной почте». Если пользователь не существует, отправьте им письмо со ссылкой на шаг 2, чтобы продолжить регистрацию.

+0

Спасибо за ваше предложение. Это веб-сайт только для некоторых друзей, и я не думаю, что мне нужно потратить много времени на разработку чего-то подобного. Любительский способ - это хорошо, для чего он хочет этого;) – ulb