PHP中的简单密码保护

时间:2010-09-09 13:27:19

标签: php passwords

我正在阅读我的“学习PHP”手册中的一个非常有趣的章节,并且遇到了一个代码示例,我想在我的个人网站上修改和使用(为了保护一个简单的文档,没有什么“大”,哪个这就是我也不加密密码的原因。)

我使用过php-sample,但根本无法使用它 在这里(不要被长度吓到,这很简单):

<?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 个答案:

答案 0 :(得分:5)

不应该...

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

实际上是..

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

即。您应该在$users中查找用户名条目而不是密码

顺便说一句,存储这样的原始密码真的很糟糕。考虑HASHSALT

检查this question以获取信息

答案 1 :(得分:3)

在验证期间,您应该更清楚地了解您正在检查的内容。始终避免使用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();
}

答案 2 :(得分:1)

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

我认为以上操作不起作用,因为$users是一个username =&gt;数组;密码。您需要检查用户名密钥:

$saved_password = $users[$_POST['username']] ;

答案 3 :(得分:1)

作为我的安全怪人,使用散列来保护您的脚本不被服务器中的漏洞破解也是一个好主意。考虑像sha1()哈希这样的东西;这是非常快速和安全的。