Доброго всем времени суток! Спасибо что читаете мой блог . Сейчас не особо много времени и идей, для пополнения моего блога, но тем не менее я решил написать небольшой пост, где поясню один момент, который интересует одного из моих читателей по имени Егор. Я выслал ему копию движка, и как мне показалось он принялся изучать его вдоль и поперек Молодец, так держать!
Он просил пояснить, а точнее рассказать по подробнее, о назначение первых строк в каждом php файле. Как он правильно догадался, данные строчки касаются безопасности движка в целом. Давайте я процитирую его слова:
Егор пишет:
Здравствуйте, не могли бы вы рассказать про
<?
if(!defined('USERPART')) die();
?>
Как я понял он запрещает доступ к файлу, если переходить по ссылки вида http://site.ru/modules/admin.php, то файл будет не доступен.
Но все таки если можете рассказать про нее подробнее или дать ссылки где про это подробно рассказано.
Спасибо!
Мне понравилось то что человек понял назначение данных строчек, и очень понравилось, то что ему захотелось знать подробнее об этом , пожалуй именно поэтому я подумал написать на данную тему отдельную заметку.
Как Вам известно наш проект состоит из отдельных файлов, все эти файлы приклеиваются (с помощью функции include) к главному нашему файлу - index.php. Проблема в том, что если в одном файле идут проверки корректности каких либо данных, а в другом - запись, или вывод при помощи этих данных, какой либо информации в базу данных (или из нее), могут возникнуть проблемы если запустить второй файл без предварительного запуска первого. Для наглядности вот код двух зависимых друг от друга файлов:
Файл первый - index.php
<?
if ($_GET['id'] == 1)
{
include('processing.php');
}
?>
Файл второй - processing.php
<?
mysql_query("DROP TABLE users ;");
?>
Первый файл определяет правильность значения переменной $_GET['id']. В данном случае, если переменная $_GET['id'] равна единице, то подключится файл который удалит таблицу users. (пример конечно немного глуповат, но ясно дает увидеть всю проблему )
Теперь вопрос на засыпку, что будет если запустить не index.php, а сразу processing.php? Правильно, коду будет все равно и он выполнит свое назначение, а именно удалит таблицу, даже если $_GET['id'] равно НЕ единице (в данном случае подобная переменная вообще не определена, но коду на это наплевать ) По мне так это очень дырявый код, во всех смыслах данного слова.
Как исправить ситуацию?
Константы штуки хорошие, по той простой причине, что их объявляют лишь один раз, после чего Вы не сможете изменить ее значение. Константы схожи с переменными, но в отличие от переменных не умеют менять значение, и могут содержать лишь определенные данные (текст число, и возможно еще чего-нить, точно не знаю ).
Как же использовать константу для того чтобы предотвратить запуск второго файла не запустив первый? Очень просто. Объявляется константа в главном файле, то бишь в index.php после чего в самом верху подключаемых файлов проверяется создана ли данная константа, и если нет мы просто прекращаем работу скрипта.
Константы создаются при помощи функции define(). Вот как приблизительно будет выглядеть более безопасный код (чем тот что я привел выше)
Файл первый - index.php
<?
define('USERPART',true);
if ($_GET['id'] == 1)
{
include('processing.php');
}
?>
Файл второй - processing.php
<?
if(!defined('USERPART')) die();
mysql_query("DROP TABLE users ;");
?>
Теперь запустив файл processing.php мы увидим пустое белое окно, так как константа, которая создается в файле index.php не определенна, стало быть движок понимает, что выполнять код будет опасно и не предсказуемо и выполняет функцию die() (данная функция убивает процесс выполнения кода).
Уважаемый Егор, очень надеюсь что я развернуто пояснил интересующий Вас момент .
Всего Вам наилучшего! У меня все!