我正在关注本教程:http://www.youtube.com/watch?v=mn0ucCuNOTI。
错误的部分是我创建了一个表单,您已使用以下代码登录并且该代码似乎有效:
<?php include_once("db.php");
session_start();
?>
<?php
$user = $_POST['name'];
$pass = $_POST['pwd'];
$sql="SELECT count(*) from phplogin WHERE(username='$user' and password='$pass')";
$query = mysql_query($sql);
$result = mysql_fetch_array($query);
if($result[0]>0){
$_SESSION['username']=$user;
echo "Successful login!";
echo "<br /> Welcome " .$_SESSION['username']. "!";
echo "<br /><a href='signupform.php' > SignUp </a>";
echo "<br /><a href='signinform.php' > SignIn </a>";
echo "<br /><a href='logout.php' > LogOut </a>";
}
else{
echo "Login failed!";
echo "<br /><a href='signupform.php' > SignUp </a>";
echo "<br /><a href='signinform.php' > SignIn </a>";
}
?>
在该页面上有一个链接,允许您注销(如果您已登录),点击该链接即可获得以下代码:
<?php
include_once("db.php");
?>
<?php
session_start(); #starts the session
session_unset(); #removes all variables in the session
session_destroy(); # destroys the session
if(!$_SESSION['username'])
echo "Succesfully logged out";
else
echo "Error occurred";
?>
然后当我在localhost上运行时,我得到以下输出:注意:未定义的索引:第12行的C:\ webserver \ apache \ htdocs \ sign_in_up \ logout.php中的用户名
成功退出
答案 0 :(得分:0)
$ _ SESSION ['username']不存在。检查变量名称是否正确,即UserName userName等...
答案 1 :(得分:0)
这里的脚本存在一些问题。我将首先回答你的具体问题。在logout.php
中,您有以下代码块:
session_start(); #starts the session
session_unset(); #removes all variables in the session
session_destroy(); # destroys the session
if(!$_SESSION['username']) {
在这里开始会话,然后取消设置该会话中的所有变量,然后销毁会话。
在调用session_destroy()
之前,您无需取消会话中的所有变量。它将自动为您取消设置所有变量。
取消设置或销毁会话后,超级全局数组$_SESSION
中不会存在任何键。因此,'username'
中的密钥$_SESSION
不再存在于您使用它的位置。相反,您可以检查该密钥是否存在:
PHP:
if (!array_key_exists('username', $_SESSION)) {
//Successfully logged out.
} else {
//Error occurred.
}
MySql Injection
正如您的代码目前所代表的那样,它非常容易受到SQL注入攻击。这意味着有人可以传入一个值,这会给你的MySql查询注入恶意或意外后果。
$user = $_POST['name'];
$pass = $_POST['pwd'];
$sql="SELECT count(*) from phplogin WHERE(username='$user' and password='$pass')";
在这里,您可以获取服务器接收到的值,并将它们直接插入查询字符串中。但是,如果有人发送$_POST['name'] = "' OR 1=1 --"
怎么办?这将使您的查询看起来像这样:
SELECT count(*) FROM phplogin WHERE (username = '' OR 1=1) --' and password='$pass')
如果你不知道,--
是一个SQL注释,意味着忽略了之后的所有内容。实际上,上述查询是:
SELECT count(*) FROM phplogin WHERE (username = '' OR 1=1)
在这种情况下,他们会收回phplogin
表中所有记录的计数,但在更敏感的操作上可能会更糟。例如,如果您的查询是为了登录管理员,该怎么办?未经授权的用户可以使用相同的方法访问管理面板。
答案 2 :(得分:0)
而不是
如果(!$ _ SESSION [ '用户名'])
尝试
如果(空($ _ SESSION [ '用户名'))