在PHP中使用javascript设置Session变量

时间:2010-08-28 09:59:45

标签: php javascript session

是否可以使用Javascript设置PHP会话变量?

9 个答案:

答案 0 :(得分:27)

在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>

答案 1 :(得分:19)

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

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

当然,你应该对暴露这样的剧本保持谨慎。

答案 2 :(得分:7)

如果您想允许客户端操纵持久性数据,那么最好只使用cookie。这就是Cookie的设计目标。

答案 3 :(得分:3)

或纯js,另请参阅StackOverflow: JavaScript post request like a form submit

但为什么要尝试用js设置$ _session?任何JS变量都可以由玩家修改 一些第三方工具(firebug),因此任何玩家都可以修改$ _session []!并且PHP无法给js任何密码(甚至[滚动]加密)返回,它都是可见的。 Jquery或AJAX无法帮助,它最终都是js。

这在网络游戏设计中经常发生。 (也许有点博弈论?请原谅我,我有一个主人并且喜欢把理论用到:))就像在crimegameonline.com,我 使用PHP初始化一个小游戏难题,将初始板保存在$ _SESSION ['foo']中。 然后,我使用PHP [make html]显示最初的拼图开始。然后,当玩家移动时,js接管,观看按钮和修改元素xy。我不想玩客户服务器(比如WOW)并问服务器'嘿,我的播放器想要转移到xy,我该怎么办?'。这是很多带宽,我不想要涉及的服务器。

每次玩家出错(或死亡)时我都可以发送POST。播放器可以阻止传出的POST(并更改本地JS变量以使其忘记输出计数)或只是修改传出的POST数据。是的,人们会这样做,特别是如果涉及真钱的话。

如果游戏很小,您可以发送更新每次移动(按钮点击),单向,以及最后两次移动的后期变量。然后,服务器完整性检查$ _SESSION ['allMoves']中的last和cats new。如果游戏规模庞大,您可以发送所有先前移动的“中途”更新,并查看它是否与最终更新列表中的匹配。

然后,在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)。

答案 4 :(得分:1)

您无法直接操作Javascript中的会话值 - 它们只存在于服务器上。

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

另见

答案 5 :(得分:1)

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

考虑我有 index.php 文件我正在创建SESSION变量(比如说$_SESSION['v']=0)如果没有创建SESSION,否则我会加载其他文件

代码是这样的:

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');

答案 6 :(得分:0)

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

答案 7 :(得分:0)

这样做时要小心,因为这是一个安全隐患。攻击者可以反复将数据注入会话变量,这些数据是存储在服务器上的数据。这可以让你看到有人用垃圾会话数据重载你的服务器。

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

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

现在攻击者只需更改putIntoSession的值并提交表单十亿次。繁荣!

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

答案 8 :(得分:0)

我使用 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;
    } 
?>