Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未定义索引:使用php会话时_Php - Fatal编程技术网

未定义索引:使用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)