Безопасность URL класса / метод маршрутизации

Есть ли у них какие-либо проблемы с безопасностью, касающиеся использования имен классов и / или параметров в URL?

Я создал простой маршрутизатор страниц PHP, который маршрутизирует пути, например:

www.mysite.com/classname/methodname/param1/param2/etc/etc

Есть ли опасности в раскрытии названий моих классов и методов? Или должна быть достаточная фильтрация в методах классов, чтобы это не беспокоило?

Кроме того, мои AJAX-вызовы будут маршрутизироваться таким же образом. Чтобы обеспечить законный вызов AJAX, могу ли я каким-то образом сгенерировать токен сеанса, который меняется каждый раз, когда выполняется вызов. Например, случайное число генерируется в сценарии PHP, к которому обращается AJAX, который также отправляется вызовом. Если они совпадают, то это авторизованный запрос. Единственная проблема заключается в том, как я могу заставить их соответствовать?

1 ответ

Решение

Самая большая проблема безопасности заключается в том, что вы не слепо включаете имя класса, например:

require_once('classes/' . $_GET['class'] . '.php');

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

class_exists() не будет достаточно Я бы сначала проверил его так, чтобы он содержал только a-z, Затем используйте file_exists, class_exists и т. Д.

Я предполагаю, что не все ваши классы и методы будут использоваться публикой через маршрутизацию, поэтому есть некоторая система, где вы проверяете, разрешен ли маршрутизатору доступ к указанному классу и методу. Это может быть сделано несколькими способами, например, получить общедоступные классы из базового класса, например BaseController и проверьте, является ли включаемый класс производным от этого, или просто храните ваши контроллеры в отдельном каталоге для внутренних классов и управляйте доступом внутри класса по мере необходимости.

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

Для вашего предложения AJAX, да, это можно сделать, сохранив токен в сеансе, чтобы вы могли проверить, совпадает ли он с вызовом. Я не думаю, что это добавит большую безопасность, хотя. Обычно сервисы AJAX выдают те же данные, что и на странице.

Другие вопросы по тегам