我的会话没有传递到不同的页面

时间:2017-07-10 09:27:16

标签: php

会话没有通过,我想限制用户在登录时查看登录页面,因为我尝试了很多东西,但它没有工作:

我的登录页面

flatMap

我的主页

<?php 

    error_reporting(E_ALL);
    ini_set('display_errors',1);

    require_once('connect.php');
    extract($_POST);

    $result = mysqli_query($link, "SELECT * FROM users ");

    $row = mysqli_fetch_assoc($result);
    //var_dump($row['username']);
    //var_dump($row['password']);
    if(isset($_POST['login'])){
        $username = $_POST['username'];
        $password = md5($_POST['password']); 
        if ($username == $row['username'] && $password == $row['password']){
            session_start();
            $_SESSION['nID'] = true;

            //echo"Login"; 
            header('Location: home.php');
        } else {
            echo"Login failed"; 
        }
    }
?>

<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
    <head>
        <meta charset="UTF-8">
        <title>Login page</title>
        <link href="style.css" type="text/css" rel="stylesheet">
    </head>
    <body>
        <div id="frm">

        <form action="login.php" method="POST" style="width: 232px; padding-left: 490px;">
            <h1> Login</h1>
        <p>
        <label>Username</label>
        <input type="text" id="username" name="username" />
        </p>

        <p>
        <label>password</label>
        <input type="password" id="password" name="password"/>
        </p>
        <p>
        <input type="submit" id="btn" value="login" name="login" style="border-radius: 30%; background-color: gold; box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24), 0 17px 50px 0 rgba(0,0,0,0.19);"/>
        </p>
        <p>
        Not yet a member <a href="register.php">Register here</a>


        </form>
        </div>
    </body>
</html>

会话未通过,并且在用户未登录时也无法阻止用户查看主页。

我尝试过很多不同的东西,但似乎没什么用。

6 个答案:

答案 0 :(得分:6)

关于这个问题的一些想法:

  • 1)停止使用extract()。你根本就不需要它。

      

    警告
    不要在不受信任的数据上使用extract(),例如用户输入(即$_POST$_FILES等)。如果您这样做,例如,如果您想暂时运行依赖于register_globals的旧代码,请确保使用其中一个非覆盖标志值,例如 EXTR_SKIP ,并注意到您应该以{{1​​}}中的variables_order中定义的顺序提取。

    From the Manual

  • 2)因为noted in another answer你的SQL查询太模糊了;您将返回搜索整个数据库的第一个答案,而不是搜索任何特定条件。

    php.ini

    然后拿下这一行并与给定的密码进行比较:

    SELECT password FROM users WHERE username=username_here LIMIT 1
    
  • 3)您在MySQL / PHP上使用的密码系统是 NOT GOOD ENOUGH 。停止使用md5()并使用password_hashpassword_verify PHP函数。请阅读how to do it properlythis comment

  • 4)每当您使用if($password === $row['password']) 重定向用户时, 强烈推荐 您添加header("Location: ...")或{{之后立即执行命令,以便停止当前页面上的代码执行。例如:

    die
  • 5)exitheader("Location: this_page_will_never_load.php"); header("Location: this_page_will_always_load_instead.php"); 函数不需要括号。

在这里引用require的众多答案;如果在输出发送到浏览器后调用 {em>},则会生成错误通知。即使使用以下内容,OP也未报告错误通知:

include

因此,session_start()代码中的session_start()位置在此特定情况下是一个问题。

然而
是最佳做法,尽早将 error_reporting(E_ALL); ini_set('display_errors',1); 放入代码中,然后再调试{{} 1}}这会导致session_start无法加载因为session_start()已经将数据输出到浏览器。

最后,回答你的问题:

  

我想限制用户在登录时查看登录页面,因为我尝试了很多东西,但它没有用:

session_start()中的代码:

var_dump

只有在为页面提供POSTed数据时,var_dump页面上的上述代码才会执行​​。你所拥有的是,一旦有人正确登录然后他们返回login.php页面,他们 重新提交 POSTed数据,所以这个代码块根本就没有运行。

由于此代码块包含所有login.php引用,因此 if(isset($_POST['login'])){ ///session stuff etc. } 似乎未运行。

相反,您希望在login.php中执行此操作(简化):

$_SESSION

答案 1 :(得分:1)

在你的home.php中试试这个条件

public void run() {
            byte[] buffer = new byte[1048576]; // 20 bits
            int bytes;
            String strRx = "";

            while (running) {
                try {
                    bytes = connectedInputStream.read(buffer);
                    final String strReceived_freq = new String(buffer,0, bytes);
                    final String strReceived_pxx = new String(buffer,(bytes/2)+1, bytes);
                    //final int samples_sdr=new Integer(buffer,0,bytes);
                    final String strByteCnt = String.valueOf(bytes) + " bytes received.\n";

                    runOnUiThread(new Runnable(){

                        @Override
                        public void run() {
                                Pxx_value.setText(strReceived_pxx+"\n");    // get data PXX
                                freq_value.setText(strReceived_freq+"\n"); // get data freq

                            // plot value
                          /*  for (int i=0; i<nb_points; i++)
                            {
                                freq[i]=Double.parseDouble(strReceived_freq);
                                pxx[i]=Double.parseDouble(strReceived_pxx);
                                series.appendData(new DataPoint(freq[i],pxx[i]), true,500);
                            }*/

                        }});

答案 2 :(得分:-1)

<?php 
session_start();
    error_reporting(E_ALL);
    ini_set('display_errors',1);

    require_once('connect.php');
    extract($_POST);

    $result = mysqli_query($link, "SELECT * FROM users ");

    $row = mysqli_fetch_assoc($result);
    //var_dump($row['username']);
    //var_dump($row['password']);
    if(isset($_POST['login'])){
        $username = $_POST['username'];
        $password = md5($_POST['password']); 
        if ($username == $row['username'] && $password == $row['password']){
            //session_start(); removed it
            $_SESSION['nID'] = true;

            //echo"Login"; 
            header('Location: home.php');
        } else {
            echo"Login failed"; 
        }
    }
?>

更新,你试试这段代码

您需要在页面标题

中添加session_start()的每个页面

答案 3 :(得分:-1)

1st:首先,您的查询错误。您始终在表格中查看第一位用户的值。您需要使用where子句进行查询。

SELECT * FROM users WHERE username=username_here AND password=hash_password_here

第二名:您的If声明应如下所示。

<?php

     session_start();
    if (!isset($_SESSION['nID'])) {

       header("Location: login.php");
        die();

    } 
?>

3Rd:尝试使用预准备语句以避免sql injection

$stmt = $link->prepare("SELECT * FROM users where username=? and password=?");

$stmt->bind_param('ss',$username,md5($password));

$stmt->execute();
$get_result =$stmt->get_result();

$row_count= $get_result->num_rows;

if ($row_count>0){

        session_start();
        $_SESSION['nID'] = true;

        header('Location: home.php');
         die();

    } else {
        echo"Login failed"; 
    }

第4名:请勿使用Md5()作为密码。尝试使用password_hash()password_verify() Reference link

注册时使用password_hash()来对密码进行哈希并将其存储在数据库中,并在登录时使用password_verify()来验证这样的密码。Reference link

答案 4 :(得分:-2)

你需要添加session_start();在每个页面中获取会话变量。

答案 5 :(得分:-2)

您必须在尝试使用会话变量的文件中调用session_start()函数。