【问题标题】:Read PHP session variables in JavaScript在 JavaScript 中读取 PHP 会话变量
【发布时间】:2015-12-18 14:35:30
【问题描述】:

我想将我的 PHP 会话变量的值发送到同一个文件中的 JavaScript。我试过这段代码,但它不起作用。请帮我解决问题。

这是我正在尝试的:

<?php
session_start();
?>

<h2>
<?php
echo "Welcome, " .$_SESSION["name"];
?>
</h2>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript" src="chat.js"></script>
</head>
<body onload="init();">
<noscript>
Your browser does not support Javascript!!
</noscript>

<!-- Some HTML Code -->

<div>
    <a href="../index.php">Go back</a>
    <a href="../home.php?SignOut" id= "left">Sign Out</a>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
$(document).ready(function() {
    $("#left").click(function() {
                //remove user_name. Set action: left
                var user_name = <?php echo json_encode($_SESSION["name"]) ?>;
                $.post('php/users.php', {user_name: user_name, action: 'left' });

            });
});
</script>
</div>  

</body>
</html>

这是我的 users.php 文件

if(isset($_POST['user_name'], $_POST['action'])) {
    $user_name = $_POST['user_name'];
    $action = $_POST['action'];

    if($action == 'joined') {
        user_joined($user_name);
    }
}


else if(isset($_POST['action'])) {
    $action = $_POST['action'];

    if($action == 'list') {
        foreach(user_list() as $user) {
            $link_address = "Chat/index.php";
            echo '<a class="a" name="a" href='.$link_address.'>'.$user.'</a>';
            echo '<br />';
        }
    }
    else if($action == 'left') {
        //call user_left function
        user_left();
    }

}

function user_left() {
    $servername = "";
    $username = "";
    $password = "";
    $dbname = "";

    //Create connection

    $conn = new mysqli($servername, $username, $password, $dbname);

    // Check connection
    if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
    }

    $user_name = $_SESSION["name"];


    $sql = "DELETE FROM online_users WHERE user_name = '$user_name'";
    $query = "DELETE FROM chat WHERE to_user = '$user_name'";

    $result = $conn->query($query);

    if($conn->query($sql) === TRUE) {
        echo "Record deleted successfully";
    } else {
        echo "Error in deleting: " . $sql. "<br>" . $conn->error;
    }


    $conn->close();
}

【问题讨论】:

  • php/users.php(带有这些参数)到底是做什么的?
  • @Michel php/users.php 从 mysql 表中删除单击注销的用户,如果该操作离开。
  • 被调用的 php 应该从会话本身读取用户名,而不是信任 post 参数
  • @Kashish :所以如果我替换 user_name 客户端的值(例如使用 Firebug),如果我知道他的用户名,我可以删除另一个用户?
  • $.post('php/users.php', { action: 'left' }); 服务器已经知道用户是谁

标签: php jquery session session-variables


【解决方案1】:

首先您必须在调试控制台中查看错误(通常可以使用 F12 键打开)。我在您的代码中看到了一个问题:php echo 语句必须在外引号中,因为它在 JS 中被解释为字符串:

var user_name = "<?php echo $_SESSION["name"] ?>";

只需打开控制台,您就会看到错误所在的确切行和字符。

将变量从 PHP 传递到 JS 的其他方式是 cookie。

【讨论】:

  • 好吧,我在你的代码中错过了json_encode。它可以在没有引号的情况下工作。其他建议效果很好:)
【解决方案2】:

原来是个愚蠢的错误。很抱歉给大家带来了困扰。

我发现了错误。我能够在 JS 中读取 php 会话(当我检查 chrome 上的元素时发现了这一点)。但是,我想这不是必需的,我只是使用了

$.post('php/users.php', { action: 'left' }); 

我没有信任用户名上的 post 参数,而是使用了会话变量。主要问题是我无法删除 user.php 文件中的用户名,我发现这是因为我使用了

$.post('php/users.php', { action: 'left' }), 

我实际上没有在 post 参数中发送任何用户名。我对 user_left 函数的调用是在我检查的 if 条件下

if (isset $_POST[user_name] && $_POST[action]), 

因此,我无法调用 user_left 函数。

这是我之前的代码

if(isset($_POST['user_name'], $_POST['action'])) {
    $user_name = $_POST['user_name'];
    $action = $_POST['action'];

    if($action == 'joined') {
        user_joined($user_name);
    }
    else if($action == 'left') {
        //call user_left function
        user_left();
    }
}
else if(isset($_POST['action'])) {
    $action = $_POST['action'];

    if($action == 'list') {
        foreach(user_list() as $user) {
            $link_address = "Chat/index.php";
            echo '<a class="a" name="a" href='.$link_address.'>'.$user.'</a>';
            echo '<br />';
        }
    }
}

我改成:

if(isset($_POST['user_name'], $_POST['action'])) {
    $user_name = $_POST['user_name'];
    $action = $_POST['action'];

    if($action == 'joined') {
        user_joined($user_name);
    }
}


else if(isset($_POST['action'])) {
    $action = $_POST['action'];

    if($action == 'list') {
        foreach(user_list() as $user) {
            //echo $user, '<br />';
            $link_address = "Chat/index.php";
            echo '<a class="a" name="a" href='.$link_address.'>'.$user.'</a>';
            echo '<br />';
        }
    }
    else if($action == 'left') {
        //call user_left function
        user_left();
    }

}

【讨论】:

  • 仍然可能想看看我的答案,因为信任此 POST 变量作为用户名可能会给您带来漏洞。
【解决方案3】:

在您的主 PHP 中,更改:

var user_name = <?php echo json_encode($_SESSION["name"]) ?>;
$.post('php/users.php', {user_name: user_name, action: 'left' });

收件人:

$.post('php/users.php', { action: 'left' });

然后在 users.php 中更改:

if(isset($_POST['user_name'], $_POST['action'])) {
    $user_name = $_POST['user_name'];
    $action = $_POST['action'];

    if($action == 'joined') {
        user_joined($user_name);
    }
}

收件人:

session_start();
if(isset($_SESSION['name'], $_POST['action'])) {
    $user_name = $_SESSION['name'];
    $action = $_POST['action'];

    if($action == 'joined') {
        user_joined($user_name);
    }
}

为什么?因为您已经与登录的用户建立了会话,所以 user_name 在会话中。从中检索它的最安全的地方将始终是会话。如果您将 session 中的 user_name 打印到 HTML/Javascript 代码中,并以 POST 参数将其发送回服务器,并信任该参数,那么用户可能已经在浏览器的开发人员工具中更改了用户名(或其他方式) 到其他人的用户名以将其注销(甚至通过您的 user_joined 方法在聊天中冒充他们)。您将创建一个安全漏洞。所以不要发送用户名往返:只需从服务器端的会话中读取它。

另外,请确保其$_SESSION["name"]$_SESSION["user_name"] 保持一致。

【讨论】:

    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 2015-04-28
    • 2017-07-08
    • 2014-01-23
    • 2012-05-18
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多