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

Posted

技术标签:

【中文标题】在 PHP 中使用 javascript 设置会话变量【英文标题】:Set Session variable using javascript in PHP 【发布时间】:2011-04-05 03:41:42 【问题描述】:

是否可以使用 javascript 设置 php 会话变量?

【问题讨论】:

【参考方案1】:

在 JavaScript 中:

jQuery('#div_session_write').load('session_write.php?session_name=new_value');

在 session_write.php 文件中:

<?
session_start();

if (isset($_GET['session_name'])) $_SESSION['session_name'] = $_GET['session_name'];
?>

在 HTML 中:

<div id='div_session_write'> </div>

【讨论】:

如果人们使用会话变量期望它们只能设置在服务器端,这可能会带来安全风险。【参考方案2】:

会话存储在服务器端,因此您无法通过 JavaScript 向其添加值。您在客户端获得的只是包含 id 的会话 cookie。一种可能性是将 AJAX 请求发送到将设置会话变量的服务器端脚本。 jQuery 的 .post() 方法示例:

$.post('/setsessionvariable.php',  name: 'value' );

当然,你应该小心暴露这样的脚本。

【讨论】:

【参考方案3】:

如果您希望允许客户端对持久数据进行操作,那么最好只使用 cookie。这就是 cookie 的设计目的。

【讨论】:

但他们提出了限制@lese majeste。所以我希望将我的 javascript 数组从一页带到另一页【参考方案4】:

或纯 js,另见 *** : JavaScript post request like a form submit

但是为什么要尝试用 js 设置 $_session?任何 JS 变量都可以被玩家修改 一些第 3 方工具(萤火虫),因此任何玩家都可以修改 $_session[]!并且PHP不能给js任何密码(甚至[滚动]加密)返回,都是可见的。 jquery 或者 AJAX 都帮不上忙,到头来都是 js。

这在网络游戏设计中经常发生。 (也许有点博弈论?请原谅我,我有一个大师并且喜欢使用理论:))就像在 crimegameonline.com 中一样,我 用 PHP 初始化一个小游戏拼图,将初始棋盘保存在 $_SESSION['foo'] 中。 然后,我使用 php [制作 html ] 显示初始拼图开始。然后,js 接管,在玩家移动时观察按钮和修改元素 xy。我不想玩客户端-服务器(如 WOW)并询问服务器“嘿,我的玩家想要移动到 xy,我该怎么办?”。这是很多带宽,我不想要涉及的服务器。

我可以在每次玩家出错(或死亡)时发送 POST。播放器可以阻止传出的 POST(并更改本地 JS 变量以使其忘记输出计数)或简单地修改传出的 POST 数据。是的,人们会这样做,尤其是在涉及真金白银的情况下。

如果游戏规模较小,您可以单向发送每个动作(按钮单击)的帖子更新,其中包含最后两个动作的帖子变量。然后,服务器健全性检查最后并在 $_SESSION['allMoves'] 中添加新的猫。如果游戏规模很大,您可以只发送所有先前动作的“中途”更新,然后查看它是否与最终更新列表匹配。

然后,在一个js认为我们赢了之后,添加或修改一个按钮来改变页面:

document.getElementById('but1').onclick=Function("leave()");
...
function leave() 
    var line='crimegameonline-p9b.php';
    top.location.href=line;

然后新页面的 PHP 查看 $_SESSION['init'] 并通过每个 $_SESSION['allMoves'] 看看它是否真的是赢家。服务器(PHP)必须决定它是否真的是赢家,而不是客户端(js)。

【讨论】:

ps:人们可能会使用 AJAX 来(获取或发布)提交单个动作,而无需转到操作页面,将它们放入会话 var 的操作 .php 页面(无文本/标题信息)。【参考方案5】:

您不能直接从 Javascript 操作会话值 - 它们只存在于服务器上。

您可以通过使用 AJAX 调用让您的 Javascript 在会话中获取和设置值。

另见

Javascript and session variables jQuery click event to change php session variable

【讨论】:

【参考方案6】:

设置会话变量的一种简单方法是将请求发送到另一个 PHP 文件。这里不需要使用 Jquery 或任何其他库。

假设我有 index.php 文件,如果未创建 SESSION,我将在其中创建 SESSION 变量(例如 $_SESSION['v']=0),否则我将加载其他文件。

代码是这样的:

session_start();
if(!isset($_SESSION['v']))
   
    $_SESSION['v']=0;

else

    header("Location:connect.php");

现在在 count.html 我想将此会话变量设置为 1。

count.html中的内容

function doneHandler(result) 
   window.location="setSession.php";

count.html javascript 部分,将请求发送到另一个 PHP 文件(例如 setSession.php),我可以在其中访问会话变量。

所以在setSession.php中会写

session_start(); 
$_SESSION['v']=1;
header('Location:index.php');

【讨论】:

【参考方案7】:

不可能。因为 JavaScript 是客户端,会话是服务器端。要执行与 PHP 会话相关的任何操作,您必须访问服务器。

【讨论】:

【参考方案8】:

这样做时要小心,因为这会带来安全风险。攻击者可以重复地将数据注入到会话变量中,会话变量是存储在服务器上的数据。这会让你看到有人用垃圾会话数据使你的服务器超载。

这是一个你不想做的代码示例..

<input type="hidden" value="..." name="putIntoSession">
..
<?php
$_SESSION["somekey"] = $_POST["putIntoSession"]
?>

现在攻击者可以改变 putIntoSession 的值并提交十亿次表单。繁荣!

如果您采用创建 AJAX 服务的方法来执行此操作,您需要确保执行安全性以确保无法发出重复请求、截断接收到的值并执行一些操作基本数据验证。

【讨论】:

【参考方案9】:

我使用 Ajax 解决了这个问题。我所做的是对 PHP 页面进行 ajax 调用,其中传递的值将保存在会话中。

我将向您展示的示例是,当您更改要在数据表中显示的项目数的值时,该值将保存在会话中。

$('#table-campus').on( 'length.dt', function ( e, settings, len ) 
    $.ajax (
       data:        "numElems": len,
       url:        '../../Utiles/GuardarNumElems.php',
       type:        'post'
    ); 
);

GuardarNumElems.php如下:

<?php    
    session_start();

    if(isset ($_POST['numElems'] ))
        $numElems = $_POST['numElems'];        
        $_SESSION['elems_table'] = $numElems;
    else
        $_SESSION['elems_table'] = 25;
     
?>

【讨论】:

以上是关于在 PHP 中使用 javascript 设置会话变量的主要内容,如果未能解决你的问题,请参考以下文章

使用 Javascript 可以从 HTML 页面中的 servlet 设置的会话属性中获取值吗

在 Javascript 中解析 PHP 会话

在 PHP 中删除 JavaScript 会话 Cookie [重复]

具有本地存储的会话

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

在 PHP 中增加会话变量的问题。它只增加一次