我正在尝试使用带身份验证的Cookie。
此页面一旦进入用户即可使用并传递
<?
if ((!$_POST[username]) || (!$_POST[password])) {
header("Location: show_login.html");
exit;
}
$db_name = "testDB";
$table_name = "auth_users";
$connection = @mysql_connect("localhost", "user", "pass") or die(mysql_error());
$db = @mysql_select_db($db_name, $connection) or die(mysql_error());
$sql = "SELECT * FROM $table_name WHERE username ='$_POST[username]' AND password = password('$_POST[password]')";
$result = @mysql_query($sql, $connection) or die(mysql_error());
$num = mysql_num_rows($result);
if ($num != 0) {
$cookie_name = "auth";
$cookie_value = "ok";
$cookie_expire = "0";
$cookie_domain = "domain.com.au";
setcookie($cookie_name, $cookis_value, $cookie_expire, "/", $cookie_domain, 0);
$display_block = "
<p><strong>Secret Menu:</strong></p>
<ul>
<li><a href=\"secretA.php\">secret page A</a>
<li><a href=\"secretB.php\">secret page B</a>
</ul>";
} else {
header("Location: show_login.html");
exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Secret Area</title>
</head>
<body>
<? echo "$display_block"; ?>
</body>
</html>
点击secretA.php或secretB.php时我被重定向再次登录,它应该可以工作。这是代码。 secretB.php
<?php
if ($_COOKIE[auth] == "ok") {
$msg = "<p>Welcome to secret page B, authorised user! </P>";
} else {
header( "Location: /show_login.html");
exit;
}
?>
<HTML>
<HEAD>
<title>Secret Page B:</title>
</HEAD>
<BODY>
<? echo "$msg"; ?>
</BODY>
</HTML>
答案 0 :(得分:2)
这可能让你搞砸了......
setcookie($cookie_name,
的 $cookis_value
强> , $cookie_expire, "/", $cookie_domain, 0);
答案 1 :(得分:1)
这就是坏代码的好例子 谢谢你发布它。很多人都可以阅读并从中学习。
让我解释一下 PHP可以帮助您找到一些模糊的错误。不是每一个,而是一些 例如,如果您错误输入变量名称,PHP将抛出错误...当然,如果您让PHP说出来 要使每个错误都可见,必须最大化错误报告级别。 为此,每个脚本都必须包含以下行:
error_reporting(E_ALL);
添加它之后,如果它是正确编写的代码,您将只看到一个指向错误输入变量的错误消息。
但是,
相反,你会看到一个错误的瀑布。
因为PHP无法区分故意错误和偶然错误。
因此。 代码中一定不是故意的错误,让你偶尔看到它们 这是值得记住的重要教训。
这些错误是什么?
username
,则必须将其写为"username"
并且$ _POST [用户名]变为$ _POST [“用户名”]
(相反,变量不需要引号,因此,echo "$msg";
必须为echo $msg;
)if ((!$_POST[username]) || (!$_POST[password])) {
if (!empty($_POST["username"]) OR !empty($_POST["password"])) {
使用这样的代码,您只会看到偶然的错误并能够立即纠正它。
答案 2 :(得分:1)
有时它是最简单的解决方案。这样的事情我也经历过。我在localhost(wampserver)上运行。我发现我的防火墙阻止了来自localhost的所有cookie请求。我当时使用ZoneAlarm,但我认为其他防火墙可能会产生相同的效果。尝试禁用防火墙以查看它是否仍无效。
答案 3 :(得分:1)
try this :
<?php
if (isset($_POST['username']) and isset($_POST['password']))
{
$db_name = "testDB";
$table_name = "auth_users";
$connection = @mysql_connect("localhost", "user", "pass") or die(mysql_error());
$db = @mysql_select_db($db_name, $connection) or die(mysql_error());
$sql = "SELECT * FROM $table_name WHERE username ='".$_POST['username']."' AND password = password('".$_POST['password']."')";
$result = @mysql_query($sql, $connection) or die(mysql_error());
$num = mysql_num_rows($result);
if ($num != 0) {
$cookie_name = "auth";
$cookie_value = "ok";
$cookie_expire = "0";
$cookie_domain = "domain.com.au";
setcookie($cookie_name, $cookis_value, $cookie_expire, "/", $cookie_domain, 0);
$display_block = "
<p><strong>Secret Menu:</strong></p>
<ul>
<li><a href=\"secretA.php\">secret page A</a>
<li><a href=\"secretB.php\">secret page B</a>
</ul>";
} else {
header("Location: show_login.html");
exit;
};
}
else
{
header("Location: show_login.html");
exit;
};
答案 4 :(得分:0)
尝试使用php设置cookie:
setcookie(<name>,<value>, time()+3600*24);
有时,在localhost中,使用以下内容未设置Cookie:$_COOKIE[<name>] = <value>