我将它放在导航文件的顶部,该文件包含在每个页面上:
if (!is_logged_in()){
login_error_redirect();
}
以下是这个功能:
function is_logged_in(){
if(isset($_SESSION['GBuser']) && $_SESSION['GBuser'] > 0){
return true;
}
return false;
}
现在这种情况很有效,因为如果您尝试浏览受保护的页面,您将被重定向到登录页面,但由于某些原因,如果您提供GET请求,它不会适用,这样您就可以完全绕过整件事情。例如,刚刚注销(调用session_destroy();),我可以输入以下地址并删除项目:
../site/products.php?delete=20
我在这里缺少什么?该产品页面包含与上面的安全检查相同的导航文件,但是传入GET变量会因某种原因完全跳过它。
编辑:这里是products.php的顶部:
require_once $_SERVER['DOCUMENT_ROOT'].'/shopping/core/init.php';
include 'includes/head.php';
include 'includes/navigation.php';
//if the delete product button was clicked
if(isset($_GET['delete'])){
$delete_id = (int)($_GET['delete']);
$db->query("UPDATE products SET deleted = 1 WHERE id = '$delete_id'");
header('Location: products.php');
}
在navigation.php的最顶部是检查:
if (!is_logged_in()){
login_error_redirect();
}
答案 0 :(得分:5)
假设login_error_redirect()
实际重定向,您必须添加exit
以在调用该函数后停止脚本。默认情况下,无论您是否在顶部重定向,PHP都将在页面上运行您的所有代码。
if (!is_logged_in()){
login_error_redirect();
exit;
}