Как улучшить скрипт входа? - PullRequest
1 голос
/ 23 августа 2010

Как я могу убедиться, что мой скрипт входа в систему безопасен и улучшен, Это мой первый код:

Помощь наиболее ценится.

<?php

include ('../includes/db_connect.php');

$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email']; 
$mobile = $_POST['mobile']; 
$username = $_POST['username'];
$password = md5($_POST['password']);

// lets check to see if the username already exists

$checkuser = mysql_query("SELECT username FROM users WHERE username='$username'");

$username_exist = mysql_num_rows($checkuser);

if($username_exist > 0){
    echo "I'm sorry but the username you specified has already been taken.  Please pick another one.";
    unset($username);
    header("Location: /registration?registration=false");
    exit();
}

// lf no errors present with the username
// use a query to insert the data into the database.

$query = "INSERT INTO users (firstname, lastname, email, mobile, username, password)
VALUES('$firstname', '$lastname','$email', '$mobile','$username', '$password')";
mysql_query($query) or die(mysql_error());
mysql_close();

echo "You have successfully Registered";
header("Location: /registration?registration=true");   
// mail user their information

//$yoursite = ‘www.blahblah.com’;
//$webmaster = ‘yourname’;
//$youremail = ‘youremail’;
//    
//$subject = "You have successfully registered at $yoursite...";
//$message = "Dear $firstname, you are now registered at our web site.  
//    To login, simply go to our web page and enter in the following details in the login form:
//    Username: $username
//    Password: $password
//    
//    Please print this information out and store it for future reference.
//    
//    Thanks,
//    $webmaster";
//    
//mail($email, $subject, $message, "From: $yoursite <$youremail>\nX-Mailer:PHP/" . phpversion());
//    
//echo "Your information has been mailed to your email address.";

?>

Ответы [ 4 ]

2 голосов
/ 23 августа 2010

Следуйте советам Артефакто о внедрении SQL и хешировании паролей в базе данных. Другие вещи ...

echo "I'm sorry but the username you specified has already been taken.  Please pick another one.";
unset($username);
header("Location: /registration?registration=false");

Не работает, потому что вы не можете эхо, а затем отправить заголовок. Заголовки должны быть отправлены перед любым выводом.

Кроме того, нет смысла делать это:

header("Location: /registration?registration=false");
echo "I'm sorry but the username you specified has already been taken.  Please pick another one.";
unset($username);

Веб-браузер сразу же перенаправит пользователя, и пользователь не увидит удобное сообщение, которое вы напечатали.

Кроме того, обычно требуется запрашивать 2 поля пароля в регистрационных формах, если пользователь сделал опечатку и не заметил, потому что весь текст был * *. Вы сравниваете 2, и если они отличаются, вы предполагаете, что была сделана опечатка, и спрашиваете снова.

1 голос
/ 23 августа 2010

Это не скрипт входа в систему.Это сценарий регистрации.

См. SQL-инъекция в руководстве по PHP.Ваша программа уязвима для такого рода атак.

Кроме того, не просто or die(mysql_error()).Это предоставит информацию о вашей базе данных, которую вы, возможно, не захотите раскрывать (имена таблиц и т. Д.).Используйте правильную обработку ошибок.Например, вы можете выдать исключение и определить обработчик неперехваченного исключения, который отображает страницу «упс» и регистрирует ошибку.

Наконец, используйте хэши со значением, превышающим MD5, например sha1 .

0 голосов
/ 23 августа 2010

Чтобы повторить то, что все остальные упоминали. Важно защитить себя (и разорвать) от внедрения SQL. Например:

$checkuser = mysql_query("SELECT username FROM users WHERE username='$username'");

Вы просто берете значение из $_POST['username'] и помещаете его в переменную $username.

Некоторые люди не очень хороши и попытаются сломать вашу программу :( Поэтому всегда рекомендуется избегать любых данных, которые были взяты у пользователя, перед помещением их в запрос SQL.

Например ...
Это:

$checkuser = mysql_query("SELECT username FROM users WHERE username='$username'");

Становится:

$checkuser = mysql_query("SELECT username FROM users WHERE username='" .mysql_real_escape_string($username). "'");
0 голосов
/ 23 августа 2010

Как сказал @Artefacto, это не скрипт входа в систему. Но если вы собираетесь сделать сценарий входа в систему, я хотел бы дать вам предложение. Я сделал это некоторое время назад.

Вместо того, чтобы делать что-то вроде этого:

$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

Я бы сделал это:

$sql = "SELECT * FROM users WHERE username = '$username'";
$user = //use the php-sql (query, fetch_row) commands to fetch the user row.
if (strcmp($user['password'], $password) == 0) {
    //log in success
}

Делая это, вы избегаете SQL-инъекций простым и элегантным способом. Что вы, ребята, думаете об этом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...