2010-09-09 114 views
2

我正在阅读我的“学习PHP”书籍中相当有趣的一章,并且遇到了一个代码示例,我想在我的个人网站上修改和使用该代码示例(为了保护简单的文档, “大”,这就是为什么我也不加密密码)。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,这会导致问题(这是“什么都没有发生”),这是在我的书中,但我不知道为什么/从哪里来的?

+3

你期待看到什么?反而发生了什么? (你知道,“它不工作”和“什么都没有发生”是一种......模糊) – Piskvor 2010-09-09 13:29:49

+0

你是对的,不是很清楚......基本上,我想要的是,如果表单已经最近提交,显示“欢迎”的事情。如果尚未提交,请显示表单。如果提交的表单没有错误,没有问题。如果提交时出现错误,请再次使用“简易错误日志” – Latze 2010-09-09 17:27:52

回答

5

不应该...

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

实际上是..

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

即你应该寻找$users用户名进入不是密码

由这样存储原始密码是非常糟糕的做法。考虑HASH ing和SALT他们。

检查this question出来的信息

+0

显示表单Yup ...那里有小错误。 – Rudu 2010-09-09 13:42:36

+0

不是一个坚守者,但你的意思是与盐一起散列,对吧?说,'sha1()'。 – Fanis 2010-09-09 19:05:39

+0

@Fanis确实。其实我已经提到了两者。谢谢。 – irishbuzz 2010-09-10 09:18:43

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(); 
} 
1
$saved_password = $users[ $_POST['password'] ]; 
if ($saved_password != $_POST['password']) { 
    echo "Password and username don't match. Please try again"; 
} 

我觉得上面不会起作用,因为$users是用户名=>密码的数组。您需要检查用户名键:

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

作为安全怪胎,我,它也将使用散列来保护你的脚本,通过在服务器中的漏洞被破解是个好主意。考虑一下像sha1()散列;它非常快速和安全。