2015-05-11 9 views
1

У меня есть каталог папок, и я хочу, чтобы пользователь с именем «x» whos-файлы были доступны следующим образом: reports/x/2015/04/от изменения x до y и просмотра всех этих слов в y. У меня есть сеансы работы, так что вам нужно войти в систему, чтобы просмотреть любые папки, но если вы вошли в систему как x, вы можете увидеть папку y, изменив URL-адрес. вот мой index.php.Как предотвратить возможность изменения URL-адреса и просмотра других папок пользователей

<?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'); 

ответ

0

Там некоторые вещи, которые по своей сути плохо делать это таким образом, но для простоты, быстрое решение будет проверять, чтобы увидеть, если имя пользователя совпадает с именем папки.

Итак, глядя на ваш код, вы можете сделать что-то подобное.

if ($username == $dir_name) { $smarty->display('general-report.tpl'); } else { $smarty->display('error.tpl'); }

Теперь, почему вы не должны делать это таким образом ...

Зарегистрированное имя пользователя не должно быть действительно виден в URL.

Вы не хотите, чтобы люди начали делиться своими именами пользователей через URL-адреса, а затем злоумышленники начинают грубый прорыв в вашу систему входа, поскольку они знают разные имена пользователей.

Если бы это был я, у меня были бы одинаковые URL-адреса отчета, и только вошедшее в систему имя пользователя определяло, какие отчеты пользователя будут отображаться.

Таким образом, вы знаете, что это видно только этому человеку, и даже если они поделились URL-адресом, их имя пользователя не будет выходить в дикую природу.

+0

причина это так, чтобы сохранить отчеты на техническое обслуживание каждого месяца. л. У меня есть это сейчас: display ('general-report.tpl'); } else { \t echo "no page for you"; } это все еще не работает – user4888750

+0

В приведенном выше примере директория $ на самом деле не установлена, поэтому она никогда не будет соответствовать. Вам нужно выяснить, в какой каталог пользователь пытается получить доступ. Посмотрите на '$ _SERVER ['REQUEST_URI']'. Затем вы можете «взорваться» на '/' и выяснить, что такое папка.Затем сравните его с именем пользователя. Вы также можете сделать 'strtolower' на имя пользователя, если в нем есть заглавные буквы. – Scheda

+0

Я думал, используя имя каталога в сеансе, а затем проверяю, соответствует ли это тому, что у нас есть в базе данных. любые идеи, как написать это? – user4888750

0

Вы можете сохранить в $_SESSION значение, представляющее дом пользователя. Если пользователь находится за пределами своего домашнего каталога, он будет перенаправлен в свой дом. Значение `$ _SESSION ['home'] может быть значением, хранящимся в базе данных, или может быть именем пользователя.

Вы можете сделать что-то вроде этого:

preg_match('/reports\/([a-zA-Z0-9]*)\//',$_SERVER['REQUEST_URI'],$matches); 
if($_SESSION['home'] != $matches[0]){ 
    header('location: reports/' . $_SESSION['home']); 
} 

Вы можете настроить регулярное выражение.

0

спасибо всем, что я получил это работает с этим:

<?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');