我的目的是创建一个页面,该页面最初显示一个基本表单,其中包含输入密码的文本字段和提交按钮。提交后,表单会将值发送回同一页面,并在其中进行检查。这发生在PHP文件中,而不是在数据库中。如果密码正确,将显示相关的HTML。这就是我所拥有的:
<?php
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
if(isset($_POST["logout"])){
session_destroy();
}elseif(isset($_POST["auth"])){
if($_POST["auth"]=="password"){
session_start();
$_SESSION["admin"]="true";
}
}
if(!isset($_SESSION["admin"])){
?>
<form action="/admin.php" method="post">
<input type="text" name="auth"><input type="submit">
</form>
<?php
}elseif($_SESSION["admin"]="true"){
?>
<section>
<!--HTML goes here-->
</section>
<section>
<form action="/admin.php" method="post">
<input type="hidden" name="logout" value="logout">
<input type="submit">
</form>
</section>
<?php }else{echo "Incorrect password";}?>
现在这部分有效。输入正确的密码将显示该人应该看到的HTML。如果输入的密码不正确,最后一行的回显将不会显示。它只是回到表单,就像第一次打开页面一样。
此外,在成功输入密码后,我收到了一些警告:
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at D:\xampp\htdocs\top.php:28) in D:\xampp\htdocs\admin.php on line 13
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\xampp\htdocs\top.php:28) in D:\xampp\htdocs\admin.php on line 13
...第13行只是session_start();
虽然我已经读过在PHP文件中存储密码存在安全问题,但这似乎不是一个主要问题,因为不超过两个人将使用包含工具的页面来操作如果搞乱或删除,这是一个主要问题。但是,如果这是一个比我想象的更大的安全问题,请告诉我。
答案 0 :(得分:0)
建议session_start()
应该是代码的第一行,您可以与所有用户开始会话,但使用存储在会话变量中的一些其他数据来验证和授权访问。
答案 1 :(得分:0)
对于下面的警告,您可以在页面顶部添加<?php ob_start(); ?>
。这样做可能会让你摆脱这些警告。
答案 2 :(得分:0)
在会话标题之后添加包含的文件。我没有看到在该页面中猜测它们需要的问题中发布的php代码中包含的文件的任何使用。所以只需在会话标题之后添加它们,这将最有可能应该解决你的问题
将此行添加到php.ini
:
output_buffering = On
PHP文档建议将 设置为数字,而不仅仅是 On &gt;&gt; http://us3.php.net/manual/en/outcontrol.configuration.php#ini.output-buffering
在.htaccess
添加:
php_value output_buffering On
答案 3 :(得分:0)
session_start();
当密码不正确时,除非使用正确的密码发布表单,否则这行代码永远不会被执行。
将该行放在顶部,然后将其从现在的位置移除。
答案 4 :(得分:0)
以下是一些基于原始代码的代码。
经过测试。
您的某个原始测试中存在一个错误,其中包含&#39; =&#39;而不是&#39; ==&#39;。
当您使用PHP选择HTML的不同部分时,我已经使用了“替代控制”#39;语法,因为它读得更好。
代码中有很多注释。随意删除&#39; em。 : - )
<?php
// PHP 5.1.18 on windows XP (XAMPP) -- i use buffered output
session_start(); // assume we always have sessions -- can be destroyed later if required
/*
* Using Alternate Control syntax for control structures
*
* This is 'cos we are using PHP to show different portions of HTML
*/
$passwordError = false; // assume password is ok
// I have these already in my development enviroment
// ini_set('display_errors',1);
// ini_set('display_startup_errors',1);
// error_reporting(-1);
if (isset($_POST["logout"])) { // logout form submitted...
session_destroy();
die(__FILE__ .' : i am done...');
} elseif (isset($_POST["auth"])) { // hard coded password! fine for testing!
if ($_POST["auth"] == "password") {
$_SESSION["admin"] = "true";
} else {
$passwordError = true; // failed password check
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Q22131957</title>
</head>
<body>
<h1>Q22131957 Login screen</h1>
<?php if (!isset($_SESSION["admin"]) || $_SESSION['admin'] != "true"): // need the admin login form to be shown?>
<form action="" method="post"> <!-- the form must come back to this script for checking... -->
<input type="text" name="auth"><input type=submit value="admin login">
</form>
<?php if ($passwordError): ?>
<strong> Incorrect password</strong>
<?php endif; ?>
<?php endif; // end of admin attempt to login... ?>
<?php if (isset($_SESSION["admin"]) && $_SESSION["admin"] == "true"): // admin is logged in successfully ?>
<!--
/*
* Normally, you would just redirect to a different URL where
* all the admin actions live.
*
* Here i just drop through to the 'logged in admin' part of the script
* as the original script did.
*
*/
-->
<section>
<!--HTML goes here-->
<p> we logged in as ADMIN! </p>
</section>
<section>
<!-- this form returns to this script! -->
<form action="" method="post">
<input type="hidden" name="logout" value="logout">
<input type="submit" value="logout">
</form>
<!-- divert to admin.php screen via a form -- testing only -->
<form action="admin.php" method="post">
<input type="hidden" name="continue" value="continue">
<input type="submit" value="continue to admin.php...">
</form>
</section>
<?php endif; // end of successful logged in admin ?>
</body>
</html>