Накопился ряд вопросов в процессе обучения PHP и создания мелких проектов. 1. Вопрос про безопасность сохранения информации о пользователях. Допустим есть БД с таблицей Users и полями userId, groupId,... . Содержимое страниц на сайте формируется в зависимости от группы пользователя(groupId), на некоторых страницах необходимо выводить id пользователя(userId). Сейчас я сохраняю эту и подобную информацию о пользователях в сессии: после авторизации пользователя, записываю в $_SESSION["userId"],$_SESSION["groupId"],... соответствующую информацию, а дальше уже работаю так: Код (Text): if ($_SESSION["groupId"] == 0){ //выводим одну информацию} else{ //выводим другую } Вопрос: На сколько правильно и безопасно так делать? 2. Вопрос про возврат результата после выполнения скрипта. Допустим, есть форма на странице index.php: Код (Text): <form action="action.php" method="post"> тут какие-либо данные для формы </form> Есть файл action.php, такого содержания: Код (Text): //какие-либо действия //возврат пользователя на страницу index.php с результатом выполнения скрипта header("Location: index.php?result=ok"); exit(); Когда происходит возврат на страницу index.php, надо сообщить пользователю о результате выполнения action.php(либо всё прошло хорошо, либо произошла ошибка). Я это делаю так: записываю в $_GET["result"] результат, а потом уже на странице index.php обрабатываю все возможные результаты и вывожу необходимую информацию для пользователя. Как мне кажется, это не совсем правильный и оптимальный вариант, потому как просто перейдя по ссылке 'index.php?result=fail' пользователь увидит сообщение об ошибке, которой на самом деле не было. Вопрос: каким образом правильно возвращать результат о ошибке/успешном выполнении скрипта action.php на страницу index.php? 3. Вопрос о закрытии прямого доступа к файлам, к которым может обращаться только скрипт проекта, а не пользователь. Допустим есть папка php/ в которой находятся различные скрипты, доступа у пользователя к ним быть не должно. Пользователь может обращаться только к файлам, расположенные в корневой директории, допустим index.php или другие. Сейчас я в файлах корневой директории, к которым есть доступ у пользователя, прописываю константу, а в файлах папки php/ проверяю объявлена ли константа, и если она не объявлена - exit(); Но этот способ не работает для файлов, которые вызываются через форму(action.php), как во втором вопросе. Вопрос: каким образом правильно запрещать доступ к файлам, к которым не должно быть доступа у пользователя, так чтобы это работало и для файлов, вызов которых идёт через форму?
Прикольный ник Код (Text): if ($_SESSION["groupId"] == 0){ //выводим одну информацию} else{ //выводим другую } Так нормально, можно еще делать так, как в WordPress, у них сессии вообще отключены, а вся работа организована через cookie и каждый раз происходит проверка данных cookie, у них такая "политика". Код (Text): <form action="action.php" method="post"> тут какие-либо данные для формы </form> Желательно обрабатывать данные на той же странице, на которой и форма, я лично считаю так, по моему не богатому опыту. Код (Text): //какие-либо действия //возврат пользователя на страницу index.php с результатом выполнения скрипта header("Location: index.php?result=ok"); exit(); это уже глупость, выше ты включал сессии, почему бы сейчас не записывать результат выполнения действия в сессию и уже от туда вытаскивать результат. в конце концов любой пользователь и без всякой обработки может перейти по ссылки Код (Text): http://site.ru/index.php?result=ok Так же советую уходить от конкретных ссылок и работать через ID, сам подумай, решишь ты перейти от такого формата Код (Text): http://site.ru/index.php?result=ok к такому: Код (Text): http://site.ru/index/add и что тогда? все ссылки переделывать по всему проекту? Как правило у страниц есть ID и ссылки работают через эти ID, что то типа: Код (Text): http://site.ru/index.php?page=1 http://site.ru/index.php?page=2 http://site.ru/index.php?page=55 http://site.ru/index.php?page=add желательно сделать одну функцию, ты ей передаешь ID, а она возвращает ссылку: Код (Text): echo get_link('55'); // выводит http://site.ru/index.php?page=55 в случае перехода от одного формата ссылок к другому, все что надо будет сделать, это отредактировать 1 функцию. Можно ввести запрет на доступ к папкам, делается это через файл .htaccess, кстати, изменение формата ссылок делается тоже через этот файл.
Спасибо за помощь. С возвратом результата и ссылками разобрался. На счёт запрета открытия файлов возникают проблемы. прописываю в .htaccess Код (Text): deny from all Проблема в том, что доступ к файлам, которые вызываются через форму(не хочу лепить обработку данных на той же странице, где форма, уж слишком много кода получается, читабельность никакая), блокируется полностью, даже для сервера. Пытался прописывать ip-адрес сервера в исключения, но это тоже не помогает. А файлы, которые просто подключаются в другие файлы, работают отлично и такой проблемы нет.
В точке входа прописываешь константу. В остальных файлах в самом начале проверяешь наличие константы. Если ее нет - die. А лучше сначала выбросить 404, а потом die. Усе. Работает и под папачем и под нджинксом и даже под аллахом. Все инклудящиеся файлы смогут работать только в контексте приложения. Попытка дернуть любой скрипт вне контекста завершится 404-й ошибкой. Ноуп, это не костыль, это бестпрактис. Юзается дофига где. Да хоть в той же джумле.
в файле index.php с формой Код (Text): <form action="action.php" method="post"> тут какие-либо данные для формы </form> прописываю в самом начале: Код (Text): define( '_TEST', 1 ); в файле action.php в самом начале прописываю: Код (Text): defined('_TEST') or die('!!!'); Отправляю форму, action.php не видит константу _TEST и всё время выбрасывает die. Для просто подключаемых файлов всё работает, а для тех, что вызываются вот так через форму - нет.
Архитектура у тебя, значит кривоватая. Тебе уже говорили - отправляй на точку входа, а там потом уже обрабатывай, как надо. Это плохо, когда форма ссылается на вторую точку. У меня, например, даже ajax-ы через один шлюз проводятся. В итоге все закрыто.
Но ведь "точка входа" - это тоже файл. И там тоже не будет видно константу... Нет ли открытых примеров где такое проделывают или просто пример какого-то средненького проекта с "правильной" реализацией?
Точка входа - это место, где константа объявлена. Это твой index.php, которая должна отвечать на любые запросы извне. Добавлено спустя 43 секунды: Joomla тебе в руки. Добавлено спустя 2 минуты 57 секунд: Кури, что такое архитектура. Стрелочками и квадратиками накидай свою систему, чтобы понять, что откуда как растет. По-хорошему твоя форма должна быть в одном из инклудящихся файлов. Отправляешь запрос на ту же страницу, с которой прокидываешь форму, вызов формируется по тому же сценарию, инклудятся те же файлы, включая обработчик формы, он детектит нужные данные в $_POST и обрабатывает их как положено. Добавлено спустя 6 минут 42 секунды: У меня, например, полным полно аякса. Люблю я какую-никакую интерактивность. И он отрабатывает в куче опционально подключаемых файлах. Каждый компонент, который не обязателен для системы, может юзать собственный ajax-обработчик(и). НО, все ajax-запросы идут строго на адрес, который сгенерировал страницу. Система сама разберется, какой скрипт нужно использовать для обработки конкретного запроса. Причем, разработчик вообще не должен париться на этот счет. Для него все прозрачно. Обработчик - это просто пхп-файлик, который просто жует POST\GET и эхает выхлоп. Никаких изощрений. Зато извне этот файлик дернуть невозможно - заперт константой. Архитектура. Надо один раз продумать, а потом не морочиться. С наскока это не получится, надо посидеть, поразмыслить.