У меня есть каталог папок, и я хочу, чтобы пользователь с именем «x», чьи файлы были доступны, например: reports / x / 2015/04 /, не менял x на y и не видел все эти сообщения в y. У меня сеансы работают так, что вам нужно войти в систему, чтобы увидеть любые папки, но если вы вошли как x, вы можете увидеть папку y, изменив URL. вот мой index.php.
<?php
session_start();
if(!isset($_SESSION['username'])){
header("Location:../../../../login/login.php");
}
require_once('../../../config.php');
require_once('../../../boilerplate.php');
global $smarty;
$smarty->display('general-report.tpl');
Есть некоторые вещи, которые по своей природе плохи в этом, но для простоты быстрое исправление будет проверять, совпадает ли имя пользователя с именем папки.
Итак, глядя на ваш код, вы можете сделать что-то вроде этого.
if ($username == $dir_name) {
$smarty->display('general-report.tpl');
} else {
$smarty->display('error.tpl');
}
Теперь о том, почему вы не должны делать это таким образом …
Зарегистрированное имя пользователя на самом деле не должно быть видно в URL.
Вы не хотите, чтобы люди начали делиться своими именами по URL-адресам, а затем злонамеренные люди начинают грубо пробираться в вашу систему входа в систему, поскольку они знают разные имена пользователей.
Если бы это был я, все URL-адреса отчетов были бы одинаковыми, а имя пользователя, вошедшего в систему, определяло, какие отчеты пользователя показывать.
Таким образом, вы знаете, что он виден только этому человеку, и даже если он где-то поделится URL-адресом, его имя пользователя не будет отображаться.
Вы можете хранить в $_SESSION
значение, которое представляет дом пользователя. Если пользователь находится за пределами своего домашнего каталога, он будет перенаправлен в свой дом. Значение `$ _SESSION [‘home’] может быть значением, хранящимся в базе данных, или само имя пользователя.
Вы можете сделать что-то вроде этого:
preg_match('/reports\/([a-zA-Z0-9]*)\//',$_SERVER['REQUEST_URI'],$matches);
if($_SESSION['home'] != $matches[0]){
header('location: reports/' . $_SESSION['home']);
}
Не стесняйтесь настраивать регулярное выражение.
спасибо всем, у меня получилось с этим поработать
<?php
/*===== Start sesstion and include config and boilerplate=====*/
session_start();
require_once('../../../config.php');
require_once('../../../boilerplate.php');
global $smarty;
/*=====Prevents seeing any pages unless logged in =====*/
if(!isset($_SESSION['username'])){
header("Location:../../../../login/login.php");
exit;
}
/*=====Allows only logged in users to see their profiles in path_report=====*/
preg_match('/maintenance_new\/([a-zA-Z0-9]*)\//',$_SERVER['REQUEST_URI'],$matches);
$path_report = explode("/", $_SESSION['path_report']);
if($path_report[0] != $matches[1]){
header('Location: /maintenance_new/' . $_SESSION['path_report'] );
exit;
}
/*=====Renders out page=====*/
$smarty->display('general-report.tpl');