Рассмотрим некоторые приемы и средства PHP, касающиеся безопасности. Здесь будут только некоторые моменты безопасности, так как все включить в одну статью не возможно. Я постарался все изложить кратко и доступно, я не включил сюда работу с register_global, работу с ошибками, и Basic авторизацию, так как это можно найти в любом учебнике по PHP. И такк начнем
Safe_mode
Права доступа к файлам – обычно задачу пытаются решить следующими действами
- Каждому клиенту заводится аккуант, т.е выдается пароль, логин и соответствующий ему числовой UID (User ID)
- Аккуанту выдается отдельная домашняя директория, принадлежащая только указанному пользователю
- Права на домашнюю директорию выставляются равными rw-------.
При таких правах механизм Unix обеспечивают невозможность захода пользователя в чужую директорию. Будем считать что каждый пользователь хранит данные своего сайта в домашней директории. Apache – это процесс, запущенный от лица системного пользователя httpd (иногда nobody). При поступлении запроса к любому сайту он работает именно под этим пользователем, и не имеет возможности переключиться на владельца сайта (по крайней мере, в стандартной поставке). Таким образом, чтобы файлы клиентов были доступны на чтение и запись пользователю httpd:
- устанавливать на директории более мягкие ограничения rwxrwx---
- входить в группу httpd, которой принадлежит и системный пользователь httpd
В итоге Apache может читать файлы клиентов, однако возникают серьезные проблемы:
- Каждый пользователь получает возможность манипулировать файлами чужого аккаунта.
- Если PHP-скрипт запущенный Apache создает какой-то файл, то его владельцем становится не пользователь аккаунта, а httpd.
- Права доступа на файлы должны, по крайней мере, разрешать чтение и запись для группы владельца файла, т.е для httpd, иначе PHP-скрипты не смогут нечего записывать в файлы, созданные пользователем в ручную.
Директивы safe_mode
В режиме safe_mode при открытии любого файла искусственно проверяет, имеет ли скрипт права это делать лил нет. С его точки зрения, файл можно прочитать, если его владелец (UID) совпадает с владельцем самого скрипта. Это порождает ужасную путаницу. Решение может дать директива:
Заставляет PHP проверять не UID, а GID файлов, т.к группа владельца аккаунта равна httpd, расщепление файлов на закаченные по FTP и созданные скриптом не проявится в фатальной форме.
PHP код:
open_basedir = директория
может задавать внутри того или иного виртуального хоста. Она говорит PHP, что ему запрещено работать с файлами вне указанного каталога. Однако ведь не только PHP имеет возможность работы с файлами:
system(“echo hello>/home/usertwo/index.php”);
PHP код:
safe_node_exec_dir = директория
Она задает, из каких директорий запускать программы при помощи system().
Средство для запрета выполнения тех или иных функции PHP:
PHP код:
disable_functionc = функ1, функ 2, ...
Только механизмы OC могут обеспечить по-настоящему надежную и защищенную среду выполнения сценариев.
Вставка форматирования в текст
Использование HtmlSpecialChars
Первая задача, которая стоит перед программистом, решить ограничить допустимое форматирование сообщения, тем или иными способ удалить из него HTML-тэги. Казалось бы, в PHP для этого имеется специальная функция
$test = strip_tags ($test);
Такой способ, однако очень плох! Дело в том, что strip_tags() использует весьма примитивный алгоритм для вырезания тэгов, а потому в некоторых случаях ее можно обмануть.
Единственно правильный и гарантированный способ удаления HTML-тэгов из сообщения погасить или экранировать их, так чтобы браузер не воспринимал боле текст, как содержащий тэги. Для этого достаточно выполнить следующие замены:
& --> &
< --> <
> --> >
После этого все тэги, имеющиеся в тексте, потеряют свой специальный смысл и превратятся в обычные символьные цепочки. Производит такую замену функция PHP HtmlSpecialChars()
Разрешение ограниченного форматирования
Как теперь разрешить к примеру, тэги <b>…</b> и <i>…</i> и запретить все остальные, это можно решить следующим образом
$test = htmlspecialchars($text);
$text = preg_replace (‘{<(/?(b|i))>}si’, ‘<$I>’, $test);
BBCode
Существует и другой прием разрешения ограниченного форматирования текста. Исторически он называется BBCode и заключается во вставке псевдотэгов в сообщение, которые в дальнейшем, уде после обработки htmlspecialchars() заменяются на нормальные HTML тэги.
Директива .htaccess
Приведу основные примеры которые могут помочь в безопасности
Запрет на открытие произвольных файлов в данной директории
Разрешить доступ к директории
Запрет на выполнение PHP-скриптов в директории, в место этого будут показываться их содержание
PHP код:
AddType application/x-httpd-php-sourse .php