Вход и регистрация проверка РНР критика


Прошу критики моего логина и регистрации проверки PHP файлов.. login.php;

<?php
session_start();
require("connect.php");
$email = $_POST['emaillogin'];
$password = $_POST['passwordlogin'];
$email = mysql_real_escape_string($email);
$password = mysql_real_escape_string($password);

    if(empty($email))
    {
        die('{status:2,txt:"Enter your email address."}');
    }

    if(!filter_var($email, FILTER_VALIDATE_EMAIL))
    {
        die('{status:2,txt:"Invalid email or password"}');
    }

    if(empty($password))
    {
        die('{status:2,txt:"Enter your password."}');
    }

    if(strlen($password)<6 || strlen($password)>16)
    {
        die('{status:2,txt:"Invalid email or password"}');
    }

$query = "SELECT password, salt FROM users WHERE Email = '$email';";
$result = mysql_query($query);

    if(mysql_num_rows($result) < 1) //no such user exists
    {
        die('{status:2,txt:"Invalid email or password"}');
    }

$userData = mysql_fetch_array($result, MYSQL_ASSOC);
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password) );

    if($hash != $userData['password']) //incorrect password
    {
        die('{status:2,txt:"Invalid email or password"}');
    }
////////////////////////////////////////////////////////////////////////////////////
    if('{status:3}')
{   
    session_regenerate_id (); //this is a security measure
    $getMemDetails = "SELECT * FROM users WHERE Email = '$email'";
    $link = mysql_query($getMemDetails);
    $member = mysql_fetch_row($link);
    $_SESSION['valid'] = 1;
    $_SESSION['userid'] = $member[0];
    $_SESSION['name'] = $member[1];
    session_write_close();
    mysql_close($con);  
    echo '{status:3,txt:"success.php"}';
}
?>

Регистрация и валидация на PHP

<?php
$name = $_POST['name'];
$surname = $_POST['surname'];
$email = $_POST['email'];
$remail = $_POST['remail'];
$gender = $_POST['gender'];
$bdate = $_POST['year'].'-'.$_POST['month'].'-'.$_POST['day'];
$bday = $_POST['day'];
$bmon = $_POST['month'];
$byear = $_POST['year'];
$cdate = date("Y-n-j");
$password = $_POST['password'];
$hash = hash('sha256', $password);
$regdate = date("Y-m-d");


function createSalt()
{
    $string = md5(uniqid(rand(), true));
    return substr($string, 0, 3);
}

$salt = createSalt();
$hash = hash('sha256', $salt . $hash);

    if(empty($name) || empty($surname) || empty($email) || empty($remail) || empty($password) )
{
    die('{status:0,txt:"All the fields are required"}');
}


    if(!preg_match('/^[A-Za-z\s ]+$/', $name))
{
    die('{status:0,txt:"Please check your name"}');
}


    if(!preg_match('/^[A-Za-z\s ]+$/', $surname))
{
    die('{status:0,txt:"Please check your last name"}');
}


    if($bdate > $cdate)
{
    die('{status:0,txt:"Please check your birthday"}');
}


    if(!(int)$gender)
{
    die('{status:0,txt:"You have to select your sex"}');
}


    if(!(int)$bday || !(int)$bmon || !(int)$byear)
{
    die('{status:0,txt:"You have to fill in your birthday"}');
}


    if(!$email == $remail)
{
    die('{status:0,txt:"Emails doesn&sbquo;t match"}');
}


    if(!filter_var($email, FILTER_VALIDATE_EMAIL))
{
    die('{status:0,txt:"Enter a valid email"}');
}


    if(strlen($password)<6 || strlen($password)>16)
{
    die('{status:0,txt:"Password must be between 6-16 characters"}');
}

    if (!$_POST["recaptcha_challenge_field"]===$_POST["recaptcha_response_field"]) 
{
    die('{status:0,txt:"You entered incorrect security code"}');
}


    if('{status:1}') 
{   
    require("connect.php");
    function getRealIpAddr()
    {
        if (!empty($_SERVER['HTTP_CLIENT_IP']))
        {
          $ip=$_SERVER['HTTP_CLIENT_IP'];
        }
        elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
        {
          $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        else
        {
          $ip=$_SERVER['REMOTE_ADDR'];
        }
        return $ip;
    }
    $rip = getRealIpAddr();
    $ipn = inet_pton($rip);
    $checkuser = mysql_query("SELECT Email FROM users WHERE Email = '$email'"); 
    $username_exist = mysql_num_rows($checkuser);
    if ( $username_exist !== 0 )
    {
        mysql_close($con);
    die('{status:0,txt:"This email Address is already registered!"}');
    }
    else
    {

    $query = "INSERT INTO users (name, surname, date, Email, Gender, password, salt, RegistrationDate, IP) VALUES ('$name', '$surname', '$bdate', '$email', '$gender', '$hash', '$salt', '$cdate', '$ipn')";
    $link = mysql_query($query);
    if(!$link)
        {
        die('Becerilemedi: ' . mysql_error());
        }
        else
        {
        mysql_close($con);  
        echo '{status:1,txt:"afterreg.php"}';
        }
    }
}

?>


3697
2
задан 24 июня 2011 в 12:06 Источник Поделиться
Комментарии
1 ответ

Вы должны разделить ваш SQL поля и имена таблиц, потому что зарезервированные слова (например, дату) может вызвать проблемы. Кроме того, я хотел бы использовать что-то вроде адреса электронной почты, так что это не чувствительны к регистру.

$query = "SELECT `password`, `salt` FROM `users` WHERE `Email` LIKE '$email';";

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

Вы, возможно, захотите использовать в mysqli функции вместо MySQL, просто потому, что они "улучшили". :-)

требовать - это языковая конструкция, а не функция, поэтому вам не нужно скобки. Они хорошо здесь, но может вызвать проблемы в некоторых случаях.

RobertPitt правильно: если('{статус:3}') будет всегда возвращать значение true.

$функция cdate = дата("г-н-Дж"); вероятно, следует использовать Д на День ж/ ведущими нулями.

если(!(инт)$пол) приведение к int-это запутанное и потребует дополнительного преобразования. Я бы для PHP это выяснить самостоятельно: если(!$пол)

Хорошая работа экранирование пользовательского ввода (от $_POST, где) в первом файле; будьте уверены, чтобы избежать всех данных, вводимых пользователем в SQL-запросы в обоих файлах.

2
ответ дан 22 сентября 2011 в 02:09 Источник Поделиться