【问题标题】:Is it possible to send a php session variable directy with ajax?是否可以使用 ajax 直接发送 php 会话变量?
【发布时间】: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 和答案,我将通读它们,当我找到解决方案时链接会报告错误

标签: php ajax session


【解决方案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() 应该能够访问会话变量。

【讨论】:

【解决方案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 分享)

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 2014-08-18
    • 2017-01-16
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    相关资源
    最近更新 更多