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