| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Безопасно ли так принимать значение? |
| Автор: maxipub 28.7.2014, 17:05 | ||
| Добрый день. Еще один банальный вопрос, но все же...
Т.е. никоим образом не фильтровать переменную, просто проверять in_array, и если все ок, то прямо так и инклудить? Возможно, есть какие-нибудь подводные камни, спецсимволы, которые in_array не уловит и т.д.? |
| Автор: Aliance 29.7.2014, 10:06 | ||
| in_array будет равен простому сравнению (==) между всеми значениями массива с группировкой по или (||). Максимум что можно добавить - это тождественное сравнение (===), путем задания третьего аргумента согласно http://php.net//manual/ru/function.in-array.php. В итоге получаем что безопасности ничего не угрожает в данном коде. Хотя я лично такой код не принял бы на ревью, предложив хотя бы такой вариант:
|
| Автор: maxipub 29.7.2014, 16:50 |
| Aliance, спасибо огромное, особенно за неточное сравнение! ЗЫ: а для общего развития, не могли бы подсказать, почему switch? Там ведь только неточное. Да и в in_array массив можно передавать переменной (из конфига или в некую функцию), вроде бы гибче и лаконичней? |
| Автор: ndbn 30.7.2014, 09:14 | ||
А я бы написал вот так, хотя вопрос не в этом.
после того, как узнал о существовании функции http://php.net/manual/ru/function.filter-input.php уже не могу её не применять |
| Автор: maxipub 30.7.2014, 10:10 |
| ndbn, а что именно filter_input выполняет в вашем примере? Вообще, не хочется разводить флуд, но какое-то странное решение... file_exists + require_once как минимум И вообще, в моем конкретном случае суть не в валидации данных, а в возможности как раз упустить ее, если in_array (как мы уже выяснили) корректно будет принимать что угодно. Ведь конкретное множество доступных значений строго определено. |
| Автор: ndbn 30.7.2014, 13:50 | ||||||||
maxipub,
Вырежет служебные символы, если не указывать третий параметр, то по-умолчанию он равен FILTER_DEFAULT или FILTER_UNSAFE_RAW.
Процитирую справку
Всякое бывает, маловероятно, но вполне реально, что обнаружится баг, например "при передаче в первом параметре функции in_array байта 0x02 она всегда возвращает TRUE"(повторюсь, это для примера). Я считаю, что лучше перебдеть. |
| Автор: maxipub 30.7.2014, 16:22 |
Так в том то и дело! Когда программист использует require, подразумевается что без данного инклуда продолжение выполнение скрипта недопустимо. Вы же своей конструкцией require превратили зачем-то в include. А для filter_input значит это не "вполне реально"? |
| Автор: s0lman 30.7.2014, 18:51 |
Лишнее обращение к файловой системе (по дефолту). Стараюсь не использовать без крайней надобности. |
| Автор: baldina 30.7.2014, 22:22 | ||
если обнаружится баг в программе (или тем паче в исполняемой системе), нужно от него избавляться, конкретно. а попытка учесть возможные баги... ![]() maxipub, имхо и так все достаточно безопасно, но уж если подходить параноидально, то единственная потенциальная проблема (в реальности её нет) - подстановка другого файла, использование относительного пути и тп штучки. filter тут бесполезен. для устранения паранойййи надо обеспечить формирование пути на основе эталонного массива, а не внешних данных, т.е.
|
| Автор: ndbn 31.7.2014, 08:37 | ||||
Моя конструкция лишь позволяет предотвратить вываливание ошибки пользователю. Даже если пользователь передал правильное имя файла, сам файл может отсутствовать по тем или иным причинам и заметить это в большом проекте может быть достаточно затруднительно. В include я ничего не превращал, разница между require и include в том, что второй генерирует warning, тем не менее не вижу смысла выводить его конечному пользователю.
Да, баг может быть где угодно, зачем пристегиваться в автомобиле, если в случае ДТП всё равно есть шанс умереть ИМХО, прием части имени подключаемого php файла от пользователя как раз такая крайняя необходимость. У вас виден большой опыт в разработке больших проектов. Ладно, срачу не быть |
| Автор: maxipub 31.7.2014, 09:32 | ||
Ну так в первом посте in_array не катит разве? Ладно, всем спасибо, вопрос решен. |