我一直在寻找一个简单的PHP脚本+表单,根据输入的用户名和密码将用户路由到特定的URL。
页面顶部的代码:
<?php
session_start();
$data=array("user1"=>array("url"=>"file1.php","password"=>"pass1"),
"user2"=>array("url"=>"file2.php","password"=>"pass2"));
if(isset($_POST['username']) && isset($_POST['password'])) {
if($data[$_POST['username']]['password'] == $_POST['password']) {
$_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
header('Location: ' . $data[$_POST['username']]['url']);
login('<p class="alert">Incorrect username or password.</p> ');
}
} else {
login();
}
?><?php
function login($response='Please enter your username and password.') {
?>
这是在身体:
<p><?=$response?></p>
<form action="" method="post">
<table width="400" border="0" cellspacing="0" cellpadding="4">
<tr>
<td width="90"><label class="loginform" for="username">Username:</label></td>
<td width="294"><input name="username" type="text" /></td>
</tr>
<tr>
<td><label for="password">Password:</label></td>
<td><input name="password" type="password"></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" value="Login" /></td>
</tr>
</table>
</form>
<?php } ?>
此代码正常运行,但如果用户输入的密码不正确,则会重定向到空白页面(具体来说,它只会在最后一页之后加载页面:
<?php } ?>
我理解这段代码编写得不好,所以这是第一个问题。我真的很想看到一个写得很好的版本(只是为了学习和研究它)。但是,如果这不可能,我将如何更正此代码,以便错误的密码不会破坏页面?
这很奇怪,因为如果您没有输入任何内容(只需点击提交),它会显示“用户名或密码不正确”,如果您只输入一个没有密码的错误用户名,同样的事情。但是如果用户名+密码错误,或者密码错误,则会转到空白页面。
提前致谢!
答案 0 :(得分:1)
缩进很重要的另一个教训。看看:
if(isset($_POST['username']) && isset($_POST['password']))
{
if($data[$_POST['username']]['password'] == $_POST['password'])
{
$_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
header('Location: ' . $data[$_POST['username']]['url']);
login('<p class="alert">Incorrect username or password.</p> ');
}
} else {
login();
}
现在你明白了。如果用户名和密码是POST,但不正确会怎样?没什么,它会退出if-blocks。
这样做:
if(isset($_POST['username']) && isset($_POST['password']))
{
if($data[$_POST['username']]['password'] == $_POST['password'])
{
$_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
header('Location: ' . $data[$_POST['username']]['url']);
exit();
}
else
{
login('<p class="alert">Incorrect username or password.</p> ');
}
} else {
login();
}
或者,甚至更好的imho:
$warning = '';
if(isset($_POST['username']) && isset($_POST['password']))
{
if($data[$_POST['username']]['password'] == $_POST['password'])
{
$_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
header('Location: ' . $data[$_POST['username']]['url']);
exit();
}
else
{
$warning = '<p class="alert">Incorrect username or password.</p> ';
}
}
login($warning);
我希望我不必告诉你这不是任何保护,除非你在登录后在每个页面上比较$_SESSION['username']
。: - )
答案 1 :(得分:0)
找出以下差异:)
提示:尝试indent括号,然后错误就会显而易见。
原:
if(isset($_POST['username']) && isset($_POST['password'])) {
if($data[$_POST['username']]['password'] == $_POST['password']) {
$_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
header('Location: ' . $data[$_POST['username']]['url']);
login('<p class="alert">Incorrect username or password.</p> ');
}
} else {
login();
}
校正:
if(isset($_POST['username']) && isset($_POST['password'])) {
if($data[$_POST['username']]['password'] == $_POST['password']) {
$_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
header('Location: ' . $data[$_POST['username']]['url']);
} else {
login('<p class="alert">Incorrect username or password.</p> ');
}
} else {
login();
}