我有第三方应用程序,用户将在其中登录或注销,并且该应用程序将他们重定向到具有用户名和用户状态(cookie也使用用户名设置)的常规网站在URL字符串中,如下所示:
登录:http://www.domain.com/?username=XXXXXXXXXX&status=login
注销时:http://www.domain.com/?username=XXXXXXXXXX&status=logout
我的处理代码如下所示:
$username = "";
$status = "";
$username = $_REQUEST['username'];
$status = $_REQUEST['status'];
if(!empty($username) && !empty($status)){
$_SESSION['username'] = $username;
$_SESSION['status'] = $status;
}
稍后在主代码中显示欢迎状态和注销/登录按钮:
if ($_SESSION['status'] == "login" && strtolower($_SESSION['username']) == strtolower($_COOKIE['username'])){ $user_status = 'in'; }
if ($_SESSION['status'] == "logout" && strtolower($_SESSION['username']) == strtolower($_COOKIE['username'])){ $user_status = 'out'; }
if ($user_status == 'in'){ ?> Welcome <?php echo strtoupper($_SESSION['username']); ?> <a href="#" class="button">Logout</a>
<?php }
elseif ($user_status == 'out' || $user_status == '') { ?> <a href="#" class="button">Login</a></div><?php } ?>
例如,我已成功登录 USER1,重定向链接 http://www.domain.com/?username=USER1&status=login 并将 cookie 设置为 USER1,但是当我使用手动重定向链接 http://www.domain.com/?username=USER2&status=logout 时,尽管 URL 中的用户名是 USER2 而不是 USER1,但 USER1 还是注销。
我怎样才能防止这种情况?
第一个代码块中的if
块有效地将登录用户和状态更改为URL中的任何内容。这允许任何人以其他人的身份登录或注销。
然后,由于在第二个代码块中不满足前两个if
条件,因此不会设置$user_status
。所以,$user_status == null == ''
.(这是您应该使用 ===
而不是 ==
的原因之一。因此,该页面显示登录链接。