在 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 设置的会话属性中获取值吗