为了账号安全,请及时绑定邮箱和手机立即绑定

仅取消设置但不破坏 php 会话是否安全?

仅取消设置但不破坏 php 会话是否安全?

守候你守候我 2022-07-21 21:16:38
我正在使用会话构建登录/注销系统,并遇到了注销/超时功能的用户端总结问题。这是由于我构建这些函数操作的页面的方式。该页面由实际页面的中央 iFrame 构建,周围有一个顶部导航栏和两个用于导航的侧边栏。侧边栏由几个 PHP 元素组成,每个元素检查是否设置了 $_SESSION["idUser"],并且 jQuery 函数在特定元素时刷新对登录状态(菜单和仅登录内容)敏感的元素被点击。我以这种方式构建它的原因是因为该页面处理浏览器游戏,并且我希望用户停留在单个 URL 上(没有任何游戏内容的永久链接)。登录/注销按钮由 jQuery 处理,它向 PHP 文件发送 AJAX 请求,该文件处理所有用户验证并刷新侧边栏元素。当用户登录处理程序时,处理程序会重新生成会话 ID(因为页面未刷新,否则如果用户注销并在同一个位置重新登录,则会话 ID 不会改变,从我目前的经验来看)。这样,无论发生什么,当您登录时,旧的会话 id 都会丢失。注销时,PHP 处理程序取消设置 $_SESSION 变量,然后销毁会话。我想要做的是在注销/超时后显示一个通知,显示用户是否自己注销或会话是否超时。我可以使用处理按钮的 Javascript 来做到这一点——因为页面本身不会刷新,所以函数会继续运行,我可以简单地让它在某处放置一些文本。我真的很想将通知放在登录表单中,就在登录按钮的正上方,因为这是人们在检查有关登录状态的信息时会查看的地方。问题是登录表单是由按钮上的 jQuery 脚本重新加载的侧边栏元素之一。jQuery 脚本首先将 AJAX 请求发送到 PHP 处理程序,然后命令重新加载侧边栏元素。但是,如果我在 .load() 部分之后附加 .done() ,则 jQuery 不会等待内容重新加载,这意味着我不能使用相同的 jQuery 函数将一些文本放入登录表单,因为 jQuery将尝试在表单加载到页面之前添加文本。到目前为止,我想出的唯一解决方案是不破坏会话,而是设置 $_SESSION["response"]="logged out",然后让登录表单回显该值。我的问题是:a)给定页面的构造方法,有没有什么方法可以在不保留PHP会话的情况下达到这个效果?b)如果不是,在注销时不销毁会话是否安全,而仅在登录时重新生成会话 ID?jQuery代码:$(".column").on("click", "#login, #logout", function () { //This handles the login/logout buttons    var formData = $(event.target).parent().parent().serialize(); //put the form data in a string    if (formData !== "") { formData += "&"; }     formData += event.target.id + "=" + event.target.id;     $.post("/backend/validateUser.php", formData) //post the login/logout data to the handler file    .done(function() { //refesh navbar and all sidebars        $(".navbar, #sidebartopl, #sidebartopr, #sidebarbottoml, #sidebarbottomr").each(function(){            $(this).load("/layout/"+$(this).attr("phpsource")+".php");        });    })    if ($(this).attr("id") === "login") {        $(".navbar").removeClass("collapsed");    } else if ($(this).attr("id") === "logout") {        $(".navbar").addClass("collapsed");    }});
查看完整描述

1 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

我找到了解决问题的方法……我可以让我的 PHP 处理程序简单地回显一些 json。这样我就可以避免整个时间问题,因为 jQuery 脚本只有在收到来自 PHP 处理程序的响应后才执行其下一个操作。


AJAX 语句现在如下所示:


$.post("/backend/validateUser.php", formData, function(data) {

  switch(data.result) {

  //case for each possible result from the handler (login/logout/timeout/register)

  }, "json")

当 PHP 处理程序成功完成特定进程中的所有操作时,它会简单地回显一个微小的 JSON 片段:


echo json_encode(["result"=>"login"]);


查看完整回答
反对 回复 2022-07-21
  • 1 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号