我正在阅读我的“学习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
,导致问题(“没有发生”),它出现在我的书中,但我不确定为什么/它来自哪里?
答案 0 :(得分:5)
不应该...
$saved_password = $users[ $_POST['password'] ];
if ($saved_password != $_POST['password']) {
...
}
实际上是..
$saved_password = $users[ $_POST['username'] ];
if ($saved_password != $_POST['password']) {
...
}
即。您应该在$users
中查找用户名条目而不是密码
顺便说一句,存储这样的原始密码真的很糟糕。考虑HASH和SALT。
检查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()
哈希这样的东西;这是非常快速和安全的。