PHP - защита параметров, передаваемых в URL - PullRequest
0 голосов
/ 07 января 2009

У меня есть приложение, которое принимает решения на основе части URL:

    if ( isset($this->params['url']['url']) ) {
    $url = $this->params['url']['url'];
    $url = explode('/',$url);
    $id = $this->Provider->getProviderID($url[0]);

    $this->providerName = $url[0]; //set the provider name

    return $id;

    }

Это происходит в приложении для торта, поэтому $ this-> params ['url'] содержит элемент URL. Затем я использую элемент URL, чтобы решить, какие данные использовать в остальной части моего приложения. Мой вопрос ...

Каков наилучший способ обезопасить этот ввод, чтобы люди не могли сделать что-нибудь неприятное?

спасибо,

Ответы [ 6 ]

1 голос
/ 07 января 2009

Другие комментарии здесь верны, в AppFontroller beforeFilter проверяет провайдера по отношению к провайдерам в вашей БД.

Однако, если все URL-адреса должны иметь префикс строки поставщика, вы собираетесь извлечь его из URL-адреса неправильно, посмотрев в $ this-> params ['url'].

Эта проблема - именно то, для чего предназначен класс маршрутизатора, и его способность передавать параметры в действие. Проверьте страницу руководства в кулинарной книге http://book.cakephp.org/view/46/Routes-Configuration. Вы можете попробовать что-то вроде:

Router::connect('/:provider/:controller/:action');

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

При настройке маршрута, который захватывает эту часть URL, он мгновенно становится доступным в $ this-> params ['provider'], но даже лучше, чем тот факт, что метод html helper link () автоматически создается правильно отформатированные URL, например

$html->link('label', array(
  'controller' => 'xxx',
  'action' => 'yyy',
  'provider' => 'zzz'
));

Возвращает ссылку типа / zzz / xxx / yyy

1 голос
/ 07 января 2009

параметр будет имя провайдера - буквенно-цифровая строка. я думаю, что ответ в основном состоит в том, чтобы использовать ctype_alpha () в сочетании с проверкой правильности имени провайдера, основанного на другой логике приложения.

спасибо за ответы

1 голос
/ 07 января 2009

Я бы повторил комментарий Карстена: определите "что-нибудь неприятное"

Что вы ожидаете от параметра? Если вы ожидаете, что это будет URL, используйте регулярное выражение для проверки URL. Если вы ожидаете целое число, приведите его к целому числу. То же самое относится к float, boolean и т. Д.

Эти функции PHP могут быть полезны, хотя: www.php.net/strip_tags www.php.net/ctype_alpha

1 голос
/ 07 января 2009

Что такое действительные имена провайдеров? Проверьте, является ли параметр URL-адреса одним, иначе отклоните его.

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

0 голосов
/ 23 марта 2009

Было бы лучше использовать класс Sanitize . В этом случае Sanitize :: escape () или Sanitize :: paranoid () кажутся подходящими.

0 голосов
/ 07 января 2009

Кроме того, если у вас есть известный набор допустимых URL-адресов, рекомендуется добавить их в белый список. Вы можете даже сделать это динамически, имея таблицу БД, которая содержит разрешенные URL-адреса - извлеките ее из базы данных, сравните с переданным параметром URL-адреса. В качестве альтернативы вы можете использовать шаблоны белого списка (допустим, вы разрешили передавать домены, но остальная часть URL-адреса изменяется ... Вы можете внести белый список в домен и / или использовать регулярные выражения для определения действительности).

Как минимум, убедитесь, что вы используете strip_tags или встроенные escape-последовательности mysql (если вы используете PHP5, параметризация ваших SQL-запросов решает эти проблемы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...