【问题标题】:PHP Can a client ever set $_SESSION variables?PHP 客户端可以设置 $_SESSION 变量吗?
【发布时间】:2010-11-15 06:10:55
【问题描述】:

是否存在客户端/用户/黑客可以自己设置$_SESSION 变量的情况(不包括在服务器计算机上运行的恶意软件。我主要是指通过浏览器)?

我问的原因是因为我几天前问的this question。从那以后,我对这个主题变得非常困惑,但我对会话固定和劫持有了更好的了解。

简单地说,如果我用isset($_SESSION['validated']) 之类的东西验证每个页面,它是否安全?

【问题讨论】:

    标签: php security


    【解决方案1】:

    如果您将 $_SESSION 变量直接分配给未过滤的用户输入,则可以。

    这让我明白了我的观点:永远不要相信用户的输入。曾经

    如果您确实在过滤输入,那么我看不出它是如何完成的。

    【讨论】:

    • 确实,(假设代表网络程序员的敏感性)它不能。 $_SESSION 的数据保存在服务器本身上,并通过存储为 cookie 的密钥进行查找。没有办法实际置换$_SESSION 本身中的数据,但用户可能会猜测另一个会话的会话 ID 并发送适当的会话 cookie。但是出于所有意图和目的,对于您(网络程序员)来说,他们与其他用户完全相同,因此无论如何保护他们不是您的责任。 Firesheep (codebutler.github.com/firesheep) 就是这样做的。
    • @Arlen - 如果您查看我的编辑,那正是我在我提出的另一个问题中寻找的答案。那里有一些代表可供争夺。
    【解决方案2】:

    是的,这是可能的。在 Wikipedia 或 Google 上阅读 Session poisoning 和另一个相当常见的安全问题 Session fixation - 网络上到处都是关于此的文章。

    【讨论】:

    • 呃……那篇文章有类似“如果攻击者和受害者共享一个网络酒店”和“有相同的会话状态但使用不同,导致歧义和竞争条件”这样的短语。但我明白你的意思,我会环顾四周。
    • 不确定会话中毒是否与此处相关。这些是与语言无关的编码问题,与使用未经处理的用户输入分配会话变量有关。事实上,客户端无法直接访问 $_SESSION。您的应用程序必须为他们做这件事。您是否允许这样做是一个单独的问题。您可以相信 $_SESSION 不会受到直接用户操作的影响,就像您可以相信用户无法直接访问 Web 根目录之外的文件一样,除非您实施了一种允许它的方法。
    【解决方案3】:

    我不认为 $_SESSION 变量可以更改,除非用户具有服务器访问权限,否则他们无法更改它,但如果是用户输入的内容,建议过滤变量或对其进行清理。

    【讨论】:

    • 你可能不应该在回答问题时猜测,尤其是因为 OP 的问题可能与私人用户数据有关
    • 请添加来源,这不是一个可靠的答案。
    【解决方案4】:

    我不太明白这个问题,但这个问题解释了我认为你想做的事情的方式。

    确保包含 jQuery。

    代码:

    <html>
    <head>
      <title>Tab name</title>
      <meta charset = "UTF-8" />
      <script type = "text/javascript" src = "http://code.jquery.com/jquery-1.1.13.min.js"></script>
      <script type = "text/javascript" src = "script.js"></script>
    </head>
    <body>
    </body>
    
    </html>
    

    然后制作一个名为addsession.php的文件。

    addsession.php 的代码:

    <?php session_start(); ?>
    <?php
      if(isset($_POST["name"])){
        $name = $_POST["name"];
      } else {
        print '<p style = "color: red; font-weight: bold;">Name not defined!</p>' . "\n";
        $name = "unknownsessionvariable";
      }
      if(isset($_POST["value"])){
        $value = $_POST["value"];
      } else {
        $value = "";
      }
      $_SESSION[name] = value;
    ?>
    

    script.js 的代码:

    function session(name, value){
      $.post(addsession.php, {"name" : name, "value" : value});
      window.location.reload(); // This line maybe should be here depending on what you are doing.
    }
    $(document).ready(function(){
      session("sessvar", "supervalue");
    });
    

    示例代码sn-p:

    function session(name, value){
      $.post("http://www.eastonwerling.com/addsession.php", {"name" : name, "value" : value});
      //window.location.reload();
    $(document).ready(function(){
      session("sessvar", "supervalue");
    });
    <script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
    <p>This example depends on www.eastonwerling.com (my website).</p>

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 2011-11-19
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      相关资源
      最近更新 更多