У меня есть приложение, которое принимает решения на основе части 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-адреса, поэтому решаю, какие данные использовать в остальной части моего приложения. У меня вопрос ...
как лучше всего обезопасить этот ввод, чтобы люди не могли передать ничего неприятного?
Благодарность,






Каковы действительные имена провайдеров? Проверьте, равен ли параметр URL единице, в противном случае отклоните его.
Надеюсь, вы знаете, что нет абсолютно никакого способа предотвратить отправку пользователем чего-либо, включая имена поставщиков, которые они не должны использовать.
Я бы повторил комментарий Карстена: определите «что-нибудь неприятное».
Какого вы ожидаете от параметра? Если вы ожидаете, что это будет URL-адрес, используйте регулярное выражение для проверки URL-адресов. Если вы ожидаете целое число, приведите его к целому числу. То же самое и с плавающей точкой, логическим значением и т. д.
Однако эти функции PHP могут быть полезны: www.php.net/strip_tags www.php.net/ctype_alpha
параметром будет имя провайдера - буквенно-цифровая строка. Я думаю, что ответ заключается в том, чтобы использовать ctype_alpha () в сочетании с проверкой правильности имени поставщика на основе другой логики приложения.
спасибо за ответы
Не забудьте также выполнить mysql_real_escape_string.
Или используйте объекты PDO для более новых версий
Кроме того, если у вас есть известный набор допустимых URL-адресов, рекомендуется занести эти разрешенные URL-адреса в белый список. Вы даже можете сделать это динамически, имея таблицу БД, содержащую разрешенные URL-адреса - вытащите это из базы данных, сделайте сравнение с переданным параметром URL-адреса. В качестве альтернативы вы можете внести шаблоны в белый список (скажем, у вас есть разрешенные домены, которые можно передавать, но остальная часть URL-адреса изменяется ... Вы можете внести домен в белый список и / или использовать регулярные выражения для определения действительности).
По крайней мере, убедитесь, что вы используете strip_tags или встроенные escape-последовательности mysql (при использовании PHP5 параметризация ваших SQL-запросов решает эти проблемы).
Другие комментарии здесь верны, в AppController beforeFilter проверяет поставщика на соответствие поставщикам в вашем db.
Однако, если все 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
Было бы проще использовать класс Дезинфицировать. В этом случае подходят Очистить :: escape () или Очистить :: параноик ().
Определите, пожалуйста, «что-нибудь неприятное». Что-нибудь, чего не получит Regex?