是否可以使用 ajax 直接发送 php 会话变量?

Posted

技术标签:

【中文标题】是否可以使用 ajax 直接发送 php 会话变量?【英文标题】:Is it possible to send a php session variable directy with ajax? 【发布时间】:2011-10-13 12:21:10 【问题描述】:

我在 index.php 中有这个

    <?php

    include_once '..\connect.php';

    session_start();

    if (isset($_SESSION['username']))
        $player_name = $_SESSION['username'];

     else     
        header( 'Location: http://localhost/Inventory/index.php' ) ;
        exit;
    

    ?>

我正在向 request.php 发出 ajax 请求

    <?php
    //connect to databate and check for errors
    $con = mysql_connect ("localhost","root","");
    if (!$con) 
        die ('Could not connect to database: ' . mysql_error());
    

    //select database and check selection
    if (!mysql_select_db ("GotA", $con)) 
        die ('Could not select database: ' . mysql_error());
    

//I have to create this if not it doesnt find the sessions $player_name variable
    $player_name = $_POST['name']; 

    //***Create Player Array**//
    $player_info = "SELECT * from players where id = $player_name";
    $player_info2 = mysql_query($player_info) or die ('Couldnt get players name');
    $player_info3 = mysql_fetch_array($player_info2);

好吧,使用 javascript 发送的变量从数据库中检索数据似乎不安全,难道没有办法直接使用 index.php(会话部分)中的变量吗? 还是仅使用 javascript 传递信息是否安全?

【问题讨论】:

请仔细阅读this question 及其接受的答案。明白它。使用它。 谢谢你们所有的 cmets 和答案,我将通读它们,当我找到解决方案时链接会报告错误 【参考方案1】:

为什么不在 request.php 中再次检索会话?

代替:

$player_name = $_POST['name']; 

用途:

$player_name = $_SESSION['username']; 

还要确保在此之前使用session_start()

【讨论】:

对,但我这里不讨论任何 JS,只讨论 PHP。 JS 只是调用一个 PHP 页面,可以访问会话。 Jason,正确的,它可以如果它知道会话 ID 并且您调用 session_id(hash)。只是调用session_start 不会恢复会话,因为 PHP 将 AJAX 视为它自己的唯一会话。 我从来没有为这样的事情使用过 session_id。在过去无数次中,我所说的方式对我来说都很好。 那我可能不正确,我的用法也可能不正确。我很抱歉。 只是为了向这些 cmets 的任何未来读者澄清这一点:用户通过键入 URL 或单击链接发起的 GET/POSTGET/ 没有什么不同POST 由 XmlHttpRequest 发起。 HTTP是HTTP。 PHP 不会为 AJAX 请求分配自己的会话,因为它不知道请求来自脚本(除非您在 PHP 和 JS 代码中构建了这样做的逻辑)。【参考方案2】:

根据我之前使用 jQuery 的经验,会话仍然适用于 ajax 请求,只要您在被调用脚本的顶部session_start() 应该能够访问会话变量。

【讨论】:

很确定你错了...我 90% 确定我已经能够使用 AJAX 设置/获取会话变量***.com/questions/607673/…【参考方案3】:

您的 AJAX 请求虽然来自 JavaScript,但仍然可以访问浏览器的会话状态。你也可以回退到一个 POSTed 变量:

request.php

<?php
session_start();

// Set $dbuser and $dbpass in a secure configuration file
$dbh = new PDO('mysql:host=localhost;dbname=GotA', $dbuser, $dbpass);

if (isset($_SESSION['username']))
    $player_name = $_SESSION['username'];
else
    $player_name = $_POST['name'];

$stmt = $dbh->prepare('SELECT * from players where id = :playername');
$stmt->execute(array(':playername' => $player_name));

$result = $stmt->fetchAll();

另一件事是,如果您正在运行多个异步请求,则具有异步会话感知请求可能会导致竞争条件。有关信息,请参阅this article。只要您只读取会话变量而不写入它们(或显式结束会话),那么您应该没问题。 (如果有人对前面的说法有明确的答案,请在 cmets 分享)

【讨论】:

以上是关于是否可以使用 ajax 直接发送 php 会话变量?的主要内容,如果未能解决你的问题,请参考以下文章

会话不适用于 ajaxRequest [如何使用会话变量计算 ajax 请求]

使用 AJAX 在 PHP 中设置会话变量

jQuery 和 ajax 在 PHP 中设置会话变量

如何使用 Ajax 函数从 php 服务器获取会话变量? (PHP HTML JS Ajax)

使用 AJAX 检查 PHP 会话是不是存在或过期

如何使用 JQUERY 读取 SESSION 变量