Простая защита паролем в PHP - PullRequest
       11

Простая защита паролем в PHP

2 голосов
/ 09 сентября 2010

Я читал довольно интересную главу в своей книге «Изучение PHP» и наткнулся на пример кода, который я хотел изменить и использовать на моем личном веб-сайте (для защиты простого документа, ничего «большого», который поэтому я тоже не шифрую пароли).

Я использовал php-пример и просто не могу заставить его работать.
Вот оно (не пугайтесь длины, это действительно просто):

<?php

if ($_POST['_submit_check']) {
    if ($form_errors = validate_form()) {
        show_form($form_errors);
    } else {
        process_form();
    }
} else {
    show_form();
}

function show_form($errors = '') {
    echo '<form method="POST" action="' . $_SERVER['PHP_SELF'] . '">';

    if ($errors) {
        echo '<br>'
        echo implode('<br>', $errors);
        echo '<br>';
    }

    echo 'Username: ';
    echo '<input type="text" name="username" value="Username goes here">';
    echo '<br>'

    echo 'Password: ';
    echo '<input type="password" name="password">';
    echo '<br>'

    echo '<input type="submit" name="submit" value="Log In">';
    echo '<input type="hidden" name="_submit_check" value="1">'; //when the form is entered, this returns true and the first line of the document is good to go

    echo '</form>';
}

function validate_form() {
    $errors = array();

    $users = array('admin' => 'pass123',
                   'notsoadmin' => 'pass1234');


    if (!array_key_exists($_POST['username']) {
        $errors[] = "Please enter username and password";
    }

    $saved_password = $users[ $_POST['password'] ];
    if ($saved_password != $_POST['password']) {
        echo "Password and username don't match. Please try again";
    }

    return $errors;
}

function process_form() {
    $_SESSION['username'] = $_POST['username'];

    echo "Welcome, $_SESSION[username]";
}

?>

До моего HTML и прочее я также добавил это:

<?php session_start(); ?>

Очевидно, что я что-то упустил ... Может быть, это $form_errors в самом начале, что вызывает проблему (что "ничего не происходит"), это было в моей книге, но я не уверен, почему / где исходит из?

Ответы [ 4 ]

5 голосов
/ 09 сентября 2010

Не следует ...

    $saved_password = $users[ $_POST['password'] ];
    if ($saved_password != $_POST['password']) {
        ...
    }

на самом деле быть ..

    $saved_password = $users[ $_POST['username'] ];
    if ($saved_password != $_POST['password']) {
        ...
    }

т.е. вы должны искать запись имени пользователя в $users, а не пароль

Между прочим, хранить такие сырые пароли - это действительно плохая практика.Рассмотрим HASH ing и SALT ing их.

Проверьте этот вопрос для информации

3 голосов
/ 09 сентября 2010

Во время проверки вы должны быть немного более внимательны к тому, что вы проверяете.Всегда избегайте if ($variable) и вместо этого используйте функцию (isset / empty / etc) для проверки состояния переменной.

if ($_POST['_submit_check']) {
    if ($form_errors = validate_form()) { //always returns an array so will evaluate to true
        show_form($form_errors);
    } else {
        process_form();
    }
} else {
    show_form();
}

//change to

if (isset($_POST['_submit_check'])) {
    $form_errors = validate_form();
    if (!empty($form_errors)) {
        show_form($form_errors);
    } else {
        process_form();
    }
} else {
    show_form();
}
1 голос
/ 09 сентября 2010

Будучи уродом безопасности, я тоже неплохо бы использовать хеширование, чтобы защитить ваш скрипт от взлома через уязвимость на вашем сервере. Рассмотрим что-то вроде хеша sha1(); это очень быстро и безопасно.

1 голос
/ 09 сентября 2010
$saved_password = $users[ $_POST['password'] ];
if ($saved_password != $_POST['password']) {
    echo "Password and username don't match. Please try again";
}

Я думаю, что выше не будет работать, потому что $users это массив username => password. Вам необходимо проверить ключ имени пользователя:

$saved_password = $users[$_POST['username']] ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...