Как Я Могу Улучшить/Обезопасить Свой Сценарий Входа?


Это простой скрипт для входа. Думал, я не уверен, когда это уместно использовать включает в себя более просто встроить код. Я также не уверен, если я должен сделать печенье, но я думаю, что я на самом деле не нужно прямо сейчас. Также глядя на мой код, это было бы легко создать "Запомнить меня" функцию?

<?php
$validUser;
$validPass;
$win;
if($_POST)
{
include('admin/functions.php');
// Database Connection
AllYourBase();

if(CheckEmpty($_POST['username']))
{
    $username = $_POST['username'];
    $validUser = true;
}
else
    $validUser = false;

if(CheckEmpty($_POST['password']))
{
    $password = $_POST['password'];
    $validPass = true;
}
else
    $validPass = false;

$query = mysql_query(sprintf("SELECT * FROM Users WHERE username = '%s'", 
                mysql_real_escape_string($username))) or die(exit());
$result = mysql_fetch_assoc($query);

// Split the Salt
$fs = substr($result['salt'], 0, 10);
$ls = substr($result['salt'], -10);

// Add The Salt
$pass = md5($fs.$password.$ls); 
$name = $result['fname']. ' ' . $result['lname'];

// Authenticate 
if($result['password'] == $pass)
{
    session_start();
    $_SESSION['name'] = $name;
    $_SESSION['auth'] = true;
    $win = true;
    // Javascript Redirect not Header()
    Redirect('index.php');
}
else
    $win = false;
}
?>

<html>
<head>

</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST">
    <?php if($_POST && $win == false): ?>
        <div class="error">Login Unsuccessful</div>
    <?php endif ?>
        <input type="text" size="10" name="username" /><br />
    <?php if($_POST && $validUser == false): ?>
        <div class="error">Empty Username</div>
    <?php endif ?>
        <input type="password" size="10" name="password" /><br />
    <?php if($_POST && $validPass == false): ?>
        <div class="error">Empty Password</div>
    <?php endif ?>
    <input type="submit" text="Submit" />
</form>
<a href="register.php">Registration Page</a>
</body>
</html>


543
1
задан 13 сентября 2011 в 05:09 Источник Поделиться
Комментарии
4 ответа

Нежели оператор else, чтобы установить значение false на неверный логин/пароль, почему не просто по умолчанию в false и только правда, если он работал. Также вы заботитесь, если оба действительны?

$validUserAndPassword  = false;

if (CheckEmpty($_POST['username']) && CheckEmpty($_POST['password']))
{
$username = $_POST['username'];
$password = $_POST['password'];
$validUserAndPassword = true;
}

БД-это дорогие ресурсы. Нет смысла в подключении к БД или даже получать вещи из БД, если вы не иметь действительный имя пользователя и пароль.

$ result = array();
if ($validUserAndPassword)
{
AllYourBase();

$query = mysql_query(sprintf("SELECT * FROM Users WHERE username = '%s'",
mysql_real_escape_string($username))) or die(exit());
$result = mysql_fetch_assoc($query);
}

Я уверен, что разделение соль обеспечивает небольшую дополнительную энтропию.

// Split the Salt
$fs = substr($result['salt'], 0, 10);
$ls = substr($result['salt'], -10);

// Add The Salt
$pass = md5($fs.$password.$ls);

Я думаю, что проверка подлинности вашей собственной личности-плохая идея (это в специализированных местах с большим количеством подводных камней). Для мытья посуды anway вы не хотите тратить время на вашу заявку, а не делать рутинные задачи, такие как проверка подлинности?

Я не специалист по фронт-энды, поэтому у меня нет хороших рекомендаций на упаковках, что может сделать это за вас. Но я играл вокруг с помощью OpenID-селектор (доступен через Google источник), который так же пакет проверки подлинности, что стек биржа сайтов используют. Это позволяет пользователям войти в свой сайт с помощью открытого идентификационных карт (Гугл/открытого идентификатора стека обмен/facebook/Yahoo и/)).

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


Думал, я не уверен, когда это уместно использовать включает в себя более просто встроить код.

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


Я также не уверен, если я должен сделать печенье, но я думаю, что я на самом деле не нужно прямо сейчас. Также глядя на мой код, это было бы легко создать "Запомнить меня" функцию?

Вы не должны запомнить меня функциональность без использования куки. В основном, вам нужно добавить чекбокс в форму. Затем, написать две отдельные части кода. Первый БИТ кода будет создать Кук, содержащий уникальный маркер (очевидно, только если флажок в данных POST), который является уникальным для его учетной записи пользователя. Второе, нужно проверить на известный маркер (хранятся в вашу базу возможно) и автоматически войти в него. Можно найти множество примеров этого искать какие-то скрипты PHP-аутентификацией на Google.

Одна вещь, которая бросается в глаза в вашем коде-это умереть(выход()). Просто умереть() или выход() является достаточным, так как они являются точными эквивалентами. Смотрите здесь.

Что касается дальнейших улучшений, Google является вашим другом.

Обновление - в отношении перенаправить вопрос в комментариях

Для перенаправления, есть плюсы и минусы каждого метода. Заголовок в PHP() является предпочтительным, поскольку он ручки редирект на стороне сервера. Однако, если любой вывод был отправлен в браузер с помощью функции header() выдаст сообщение об ошибке. В таком случае, метод JavaScript по-прежнему может быть использована для переадресации пользователей. Недостатком использования JavaScript для перенаправления заключается в том, что JavaScript может быть отключен для отключения редиректа.

Можно использовать комбинацию из двух методов редиректа. Что-то вроде этого наверное:

<?php

function Redirect($url)
{
// if headers have been sent, use javascript
if (headers_sent())
{
// write redirect
echo '<script>window.location = "' . $url . '"</script>';

// fallback in case javascript is disabled
echo '<noscript>Click <a href="' . $url . '">here</a> to continue.</noscript>';
}

// if header have not been sent, use php to redirect
else
{
header('Location: ' . $url);
exit;
}
}

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

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

Таким образом, вам даже не придется беспокоиться о дополнительной нагрузке вместе с другими столбцами таблицы "пользователи" охватывается спецсимвол.

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

Взгляните на стек обмен вопросы:

Как я могу безопасно хранить пароли пользователей?

Что хэш пароля следует использовать?

В принципе, алгоритм MD5 не достаточно. Алгоритм MD5 предназначен, чтобы быть быстрым, и это плохо. Вы действительно не должны писать свой собственный метод хэширования пароля. В PHP, вы должны использовать склепа:

// Generate hash - This will also make a salt for you
$hashed = crypt($password);

// Check hash - This uses the salt from $hash_from_database as in the input salt
$hashed = crypt($password, $hash_from_database);
if($hashed == $hash_from_database) {
// success, passwords match
}

Почему вы должны сделать это

То, что вы ищете-это ключевое деривации функции. Популярные примеры включают PBKDF2 с, склеп, осуществляется, и когда-либо популярной "добавить соль и хэш".

Почему "добавьте соль и хэш" худших из них?


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

  • Как быстро это? Если кто-то возьмет вашу базу данных с паролем + соль, сколько времени потребуется им, чтобы сломаться одна? Ответ не очень долго. Алгоритм MD5 предназначен, чтобы быть быстрым, и это именно то, что вы не хотите, когда вы хэширования пароля. Так сколько раз нужно петли? Что происходит, когда вам нужно сделать, это изменить размер петли? Хранить все старые пароли? Продолжайте делать это каждый раз сделать компьютеры быстрее?

Система использования чужого пароля

1
ответ дан 19 сентября 2011 в 11:09 Источник Поделиться