未定义索引:使用php会话时
我将遵循以下教程: 错误的部分是我创建了一个表单,您使用以下代码登录,并且该代码似乎可以工作:未定义索引:使用php会话时,php,Php,我将遵循以下教程: 错误的部分是我创建了一个表单,您使用以下代码登录,并且该代码似乎可以工作: <?php include_once("db.php"); session_start(); ?> <?php $user = $_POST['name']; $pass = $_POST['pwd']; $sql="SELECT count(*) from phplogin WHERE(username='$user' and password='$p
<?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>";
}
?>
$\u会话['username']不存在。检查变量名是否正确,如用户名等。您的脚本有一些地方出错。我先具体回答你的问题。在logout.php
中,您有以下代码块:
session_start(); #starts the session
session_unset(); #removes all variables in the session
session_destroy(); # destroys the session
if(!$_SESSION['username']) {
在这里启动会话,然后取消设置该会话中的所有变量,然后销毁会话
在调用session\u destroy()
之前,不需要取消设置会话中的所有变量。它将自动为您取消设置所有变量
取消设置或销毁会话后,超级全局数组,$\u session
中将不存在密钥。因此,键'username'
不再存在于使用它的$\u会话中。相反,您可以检查该密钥是否存在:
PHP:
其他问题
MySql注入
正如您的代码目前所处的状态,它极易受到SQL注入的攻击。这意味着有人可能传入一个值,该值会向MySql查询中注入恶意或意外后果
$user = $_POST['name'];
$pass = $_POST['pwd'];
$sql="SELECT count(*) from phplogin WHERE(username='$user' and password='$pass')";
在这里,将接收到的值传递给服务器,并将其直接插入查询字符串中。但是,如果有人发送了$\u POST['name']=“'或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
表中所有记录的计数,但在更敏感的操作中可能会更糟。例如,如果您的查询是要登录管理员,该怎么办。未经授权的用户可以使用相同的方法访问管理面板
相反,您应该将准备好的语句与或库一起使用。而不是
如果(!$\会话['username'])
试一试
如果(空($_SESSION['username'))在db.php
中发生了什么,并且您显示的文件是logout.php
?您的脚本容易受到SQL注入的攻击。@Gumbo您不是在开玩笑,sheesh。好吧,现在很明显了。您已销毁并取消了会话。您无法再访问$\u会话['username']
,因为它不存在。如果(!array\u key\u存在('username',$\u SESSION)),您可以执行
instead@FilipEriksson您应该在include之前放置session\u start()
,然后就好像mysql函数由于某种原因失败一样,它们会将输出发送到浏览器,从而导致session\u start()
失败。您的漏洞将不起作用,因为它缺少用于构建语法有效语句的结束符)
。此外,PHP的MySQL扩展不支持多个语句,因此您的DROP TABLE
示例也不起作用。@Gumbo I再次更正mysql\u query()向服务器上与指定链接标识符关联的当前活动数据库发送唯一查询(不支持多个查询)。
SELECT count(*) FROM phplogin WHERE (username = '' OR 1=1) --' and password='$pass')
SELECT count(*) FROM phplogin WHERE (username = '' OR 1=1)