2010-09-09 144 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()散列;它非常快速和安全。