在浏览器中查看和更改会话变量

Posted

技术标签:

【中文标题】在浏览器中查看和更改会话变量【英文标题】:View and change sessions variables in a browser 【发布时间】:2011-01-26 16:18:18 【问题描述】:

调试 php 程序,是否有任何浏览器插件/插件可以查看会话变量(那些 PHP $_SESSION["foobar"] )?

最好能改变变量中的值。

【问题讨论】:

【参考方案1】:

无法从客户端操作存储在会话中的值。

这是您通过 cookie 使用会话的主要原因之一 - 您可以控制数据。 使用 cookie,用户可以操作数据。

从客户端访问/操作会话数据的唯一方法是使用 Ajax 调用或其他 javascript 机制来调用另一个 php 脚本,这将通过 session_ 函数进行会话数据的检索/操作.

【讨论】:

【参考方案2】:

$_SESSION 是一个服务器端变量数组。如果我们可以读取或更改这些值,我们可以做很多事情来破解或导致其他不好的事情发生。

但是,使用 phpinfo(); 我们可以查看会话变量 - 但我们无法更改值。

更好的是,我们可以调试所有会话变量

print_r($_SESSION); 
//if you echo "<pre>" before, and a closing "</pre>" after, it prints very cleanly.

其他一些有用的命令:

session_start(); // start session  -- returns Session ID
session_destroy(); // unset all session variable

Session 是一个数组,所以如果你设置$_SESSION['key']='value';,它就和$array['key']=value; 一样——只是,$_SESSION 的特别之处在于它会一直持续到窗口关闭,或者调用session_destroy()

【讨论】:

PHP 是否将 $_SESSION 变量存储在内存或(和)数据库中?背景是,我有一个 PHP 应用程序要维护。这个分支版本是原始版本的克隆,旨在做一些只读的东西(主要是报告)。而且,对于这个分支版本,只提供对数据库服务器(主版本正在运行)的只读访问权限。使用了相当多的 $_SESSION 变量。我需要调试它们并(希望)保持登录/退出功能作为主应用程序。 可以用 print_r($_SESSION) 调试 session_destroy(); 确实 NOT 取消设置任何变量。请注意这一点,以免在调试过程中头疼...SEE DOCUMENTATION【参考方案3】:

您可以使用以下代码:

<?php
error_reporting(E_ALL);
session_start();
if (isset($_POST['session'])) 
    $session = eval("return $_POST['session'];");
    if (is_array($session)) 
        $_SESSION = $session;
        header("Location: $_SERVER['PHP_SELF']?saved");
    
    else 
        header("Location: $_SERVER['PHP_SELF']?error");
    


$session = htmlentities(var_export($_SESSION, true));
?>
<!DOCTYPE html>
<html lang="en-US">
    <head>
        <meta charset="UTF-8">
        <title>Session Variable Management</title>
        <style>
            textarea  font: 12px Consolas, Monaco, monospace; padding: 2px; border: 1px solid #444444; width: 99%; 
            .saved, .error  border: 1px solid #509151; background: #DDF0DD; padding: 2px; 
            .error  border-color: #915050; background: #F0DDDD; 
        </style>
    </head>
    <body>
        <h1>Session Variable Management</h1>
<?php if (isset($_GET['saved']))  ?>
        <p class="saved">The session was saved successfully.</p>
<?php  else if (isset($_GET['error']))  ?>
        <p class="error">The session variable did not parse correctly.</p>
<?php  ?>
        <form method="post">
            <textarea name="session" rows="<?php echo count(preg_split("/\n|\r/", $session)); ?>"><?php echo $session; ?></textarea>
            <input type="submit" value="Update Session">
        </form>
    </body>
</html>

【讨论】:

好的,但是你能用上面的脚本改变会话值吗?【参考方案4】:

但是请注意,虽然会话“变量”存储在服务器端,但会话 ID 要么在 GET/POST URL 中(一个非常糟糕的想法),要么存储在浏览器 cookie 中(更好的安全性),但仍然如果您不小心处理基于 Cookie 的会话 ID,则容易受到操纵/攻击/等。

http://en.wikipedia.org/wiki/Session_fixation

http://en.wikibooks.org/wiki/PHP_Programming/sessions#Avoiding_Session_Fixation

【讨论】:

以上是关于在浏览器中查看和更改会话变量的主要内容,如果未能解决你的问题,请参考以下文章

.NET C# 会话变量未在 Safari 浏览器中更新

无法在 phpMyAdmin 中无错误地启动会话,会话变量不起作用

JSF 2.0 在整个会话中从浏览器和以编程方式设置区域设置 [重复]

创建 PHP 会话变量会挂起我的浏览器

即使在 Flask 中关闭浏览器后,如何将一个会话变量存储一段时间?

会话保存在哪里?