Php 实施会话以保持用户记录,安全问题

Php 实施会话以保持用户记录,安全问题,php,javascript,html,security,Php,Javascript,Html,Security,以下问题是一个安全问题。 只要用户的浏览器处于打开状态,我就使用会话保持用户登录到我的站点 现在,我的php代码让用户保持日志记录非常简单。 当用户登录内部时,我首先使用用户名创建会话(authentication.php): 然后,我从每个页面创建一个对JavaScript的调用,以检查用户是否存在我更改web页面(AJAX) 为了看起来用户已登录(显示在页眉欢迎中),JavaScript如下所示: function checkUserExistance(data,size) { va

以下问题是一个安全问题。 只要用户的浏览器处于打开状态,我就使用会话保持用户登录到我的站点

现在,我的php代码让用户保持日志记录非常简单。 当用户登录内部时,我首先使用用户名创建会话(authentication.php):

然后,我从每个页面创建一个对JavaScript的调用,以检查用户是否存在我更改web页面(AJAX) 为了看起来用户已登录(显示在页眉欢迎中),JavaScript如下所示:

function checkUserExistance(data,size)
{
    var xmlhttp;

    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    } else {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            var response = xmlhttp.responseText;           
            document.getElementById("title").value = response;
        }
    }

    xmlhttp.open("POST",url + page,true);

    xmlhttp.send();
}
现在在serer端,为了检查用户是否已登录,我使用JavaScript正在调用的以下简单函数:

session_start();
if (isset($_SESSION['user'])) {
    echo $_SESSION['name'];
}
现在我的问题很简单,这是正确的方法吗?只要浏览器打开,就可以保持用户身份验证,因为如果我做对了,JavaScript就在客户端,这意味着每个人都可以更改它,并跳过服务器端在页面上发表评论的检查


我的解决方案是在发布评论时添加另一个检查,即在服务器端检查用户是否有打开的会话,但用户可以假装是另一个已经通过身份验证的用户,这太令人沮丧了。。。。我遗漏了什么?我应该做什么?

尽管您可能希望在生产中使用一个已建立的安全框架,但如果您试图理解经典安全会话管理的原则,那么您的理解就不远了。重要的是检查站点中每个页面顶部的会话数据,以确保用户没有跳过登录检查

从用于管理会话的服务器返回的cookie将保存在浏览器的内存中。在从任何页面发送任何用户内容之前,首先检查用户是否已登录(会话变量中是否有用户名)。如果为空,则用户未登录,因此您将其发送到登录页面,询问其用户名/密码组合

还要记住,服务器内存中保存的会话状态对进程回收没有弹性,在负载平衡的web场上也不会像预期的那样工作

任何类型的后续浏览器请求(XMLHTTP、HTML、JPGs)都将包含此cookie,您可以在服务器端使用它来检查会话。因此,您在这里所做的工作将起作用,例如,服务器使用cookie绑定您的会话。只要你的cookie不是“可猜测的”,这就是用户名/密码认证系统的工作原理

我想说,您实际上不需要对XMLHTTP做任何事情,除非您想让会话保持更长时间的开放。通常,服务器会在几分钟后使cookie过期(可配置)

总而言之,对于穷人的安全系统而言

  • 每个浏览器请求,检查$_会话['user'],如果它是空的,直接进入登录页面
  • 在登录页面上,检查用户名/密码匹配(读者练习:)。如果是,在会话中存储用户名(会话将自动返回cookie)
  • 基本上就是这样。浏览器cookie每次都会被发送,只要你每次收到请求时不要忘记检查,你就可以去了。这也是为什么使用框架很好的原因,但我认为在这里,当您正在做的时候,理解基础知识是很有用的

    其他需要记住的事情; 首先,您应该只检查服务器端的安全性。在客户端javascript中无法执行此操作。其次,您需要为每个请求都这样做。浏览器每次都会发送一个cookie,只要该cookie与您之前检查的用户名/密码中的会话变量匹配就可以了。如果没有cookie,或者cookie所关联的会话变量不包含您先前设置的用户变量,则该用户未登录,您应再次将其重定向到登录页面。你对每一个请求都这样做

    请记住,AJAX调用仍然是一个请求,因此也必须在服务器端进行相同的登录检查。最简单的方法是用PHP而不是客户端javascript设置页面标题,但是如果您想让它成为ajax客户端,那么您需要处理服务器可能会由于上述原因拒绝您的请求的可能性,并且将您重定向到登录页面并不是您期望从XMLHttPrequest得到的响应。因此,至少您需要更复杂的错误处理,最多您可以将登录过程重写为仅AJAX

    下面是服务器的一些伪代码

    if session(name) is empty then
        if IsAjaxRequest then
            send ajax access denied response code and exit
        else
            redirect browser to login page
        endif
    else
        if IsAjaxRequest then
             send ajax data // eg. title
        else
             send html page (injecting session(name) into title)
        endif
    endif
    

    也就是说。我不会写那个伪代码。我会使用不同的端点(页面)来提供浏览器HTML响应和AJAX API响应,但希望您能大致了解您的选择。

    现在没有,因为我只是在localhost上测试网站,但这与我的问题无关。您的问题与安全性有关,很明显,这与你的问题有关。我强烈建议您使用框架,而不是自己管理会话(我不熟悉PHP,但Google是您的朋友)。关于保持会议的活力,我建议你看看这个答案:我喜欢你的解释,但我还是不明白。我的主页是index.php成功登录后,我将用户重定向到index.php,在那里我检查$u会话['user']是否存在,并在其中使用此用户名更改index.php中的html代码以迎接用户,为此,我需要使用javascript(AJAX)向服务器端发送请求以检索$u会话['user']并更改html中的标题。如果我错了,请纠正我,但我需要在这里使用javascript将index.php的内容更改为greetAh think I Seek you’s you’(我想我看到了您想要做的事情)。见我上面的补充。
    if session(name) is empty then
        if IsAjaxRequest then
            send ajax access denied response code and exit
        else
            redirect browser to login page
        endif
    else
        if IsAjaxRequest then
             send ajax data // eg. title
        else
             send html page (injecting session(name) into title)
        endif
    endif