Как пережить полный конец обеда или безопасность в PHP

CAD обзор

image

Здравствуйте. Меня зовут Саша Бараник. В Mail.ru Group я руковожу отделом разработки сайтов, который состоит из 15 сотрудников. Мы научились создавать сайты для десятков миллионов пользователей. Мы легко справляемся с миллионами зрителей каждый день. Я сам занимаюсь веб-сайтами уже около 20 лет, но последние 15 лет мою работу приходится планировать в основном на PHP. За это время потенциал языка и подход к его развитию сильно изменился, но понимание основных уязвимостей и способов защиты от них остается фундаментальным навыком для каждого разработчика.

Существует множество статей и руководств по безопасности в Интернете. Я нашел эту книгу очень подробной, но в то же время краткой и понятной. Я с удовольствием помогу вам узнать что-то новое и сделать ваш сайт более безопасным.

P. S. Это замечательная книга, и мне нужно перевести ее в разные статьи. Пожалуйста…

Существует много способов начать книгу по безопасности в PHP. К сожалению, я не читал ни одной из них, так что мне придется разбираться во время написания. Я, вероятно, начну с основ и надеюсь, что все пойдет хорошо.

Если мы рассмотрим абстрактное онлайн-приложение, которое компания X запускает в Интернете, мы можем предположить, что оно содержит ряд элементов, нарушение которых может нанести серьезный ущерб. Такие как ;

  1. Ущерб для пользователя: доступ к электронной почте, паролям, личным данным, банковским картам, профессиональным секретам, спискам контактов, истории транзакций, глубоко охраняемым секретам (как кто-то называет блеск собак). Утечка этих данных наносит ущерб пользователям (частным лицам и компаниям). Веб-приложения, использующие эти данные, и центральные компьютеры, использующие доверие пользователей, также могут быть повреждены.
  2. Ущерб для компании X: Ущерб, нанесенный пользователем, может повлечь за собой ущерб репутации, компенсацию, потерю важной деловой информации, дополнительные расходы — инфраструктура, повышение безопасности, восстановление, судебные издержки, значительные выплаты для уволенных руководителей высшего звена и т.д.

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

Убеждения в безопасности в значительной степени являются результатом культуры программирования. Некоторые разработчики потеют при мысли об уязвимостях, а другие могут сомневаться в их существовании до тех пор, пока не докажут, что уязвимостей вообще не существует. Между этими двумя концами находится множество разработчиков, которые просто поднимают плечи, потому что у них еще не было никаких проблем. Им трудно разобраться в этом странном мире.

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

  1. Кто хочет напасть на нас?
  2. Как они могут напасть на нас?
  3. Как мы можем остановить их?
Содержание
  1. Кто хочет напасть на нас?
  2. Как они могут напасть на нас?
  3. Как я могу остановить их?
  4. Основные принципы безопасности
  5. 1. не доверяйте никому!
  6. 2. всегда предполагать наихудший сценарий развития событий
  7. 3. использовать многоуровневую защиту (защита в глубину)
  8. 4. будь проще, глупее (поцелуй)
  9. 5. придерживается принципа «меньше привилегий».
  10. 6. злоумышленники чуют двусмысленность.
  11. 7. читайте документацию (RTFM). Но никогда не доверяйте этому.
  12. 8. не будет функционировать, если не будет проверен.
  13. 9. всегда виноват ты!
  14. Критерии валидации
  15. Обратите внимание на контекст.
  16. Используйте только белые, а не черные списки
  17. Не пытайтесь изменять входные данные
  18. Никогда не доверяйте внешним инструментам проверки для отслеживания уязвимостей
  19. Избегайте преобразования типов в PHP
  20. Типы проверки данных
  21. Валидация типа данных.
  22. Проверки валидности символов
  23. Проверка формата.
  24. Проверьте ограничения.
  25. Проверка наличия данных
  26. Соответствие данных.
  27. Проверка логики.
  28. Проверьте доступность ресурсов.
  29. Верификация источников входного сигнала
  30. Заключение.

Кто хочет напасть на нас?

Ответ на первый вопрос очень прост: все и вся. Да, вся Вселенная хочет преподать вам урок. Ребенок с турбированным компьютером под управлением Kali Linux? Возможно, он уже напал на вас. Подозрительный мужчина, который любит ставить преграды на пути ваших проектов? Возможно, он уже нанял кого-нибудь, чтобы напасть на вас. Trusted API break используется для восстановления данных в час? Подбросить зараженные данные, которые, вероятно, были взломаны месяц назад. Я тоже могу напасть на тебя! Поэтому нет необходимости слепо верить этой книге. Считайте меня лжецом. Затем найдите разработчика, возьмите меня с собой и опубликуйте мои вредные советы. Тем временем, возможно, это будет раздражать и вас…

Смысл этого заблуждения в том, чтобы облегчить мысленную классификацию всех тех, кто взаимодействует с вашим веб-приложением («пользователи», «хакеры», «базы данных», «незащищенные записи», «менеджеры», «REST API»). Присвойте каждой категории индекс доверия. Очевидно, что «хакер» не заслуживает доверия, но как насчет «базы данных»? ‘Не доверенный вход’ получил такое название неспроста, но действительно ли он отфильтровывает сообщения в блогах, исходящие из доверенных атомарных потоков ваших коллег?

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

Вернемся к базе данных. Если предположить, что хакеры имеют доступ к базе данных (а параноики всегда предполагают это), мы не можем доверять ей. Большинство приложений определенно доверяют базе данных. Внешне веб-приложение выглядит как законченный набор, но внутри это система дискретных элементов, которые обмениваются данными. Если все эти элементы считаются надежными, то при нарушении одного из них быстро нарушаются и все остальные. Этот катастрофический вопрос безопасности не может быть решен фразой «если вы нарушаете правила, вы все равно проиграете». Вы можете так говорить, но если вы не доверяете в первую очередь своей базе и не действуете соответственно, то вам и не нужно этого делать!

Как они могут напасть на нас?

Ответом на второй вопрос является довольно обширный список. Они могут атаковать нас оттуда, откуда мы получаем данные, — на уровне отдельных компонентов или на уровне веб-приложений. По сути, веб-приложения просто обрабатывают данные и переносят их с места на место. Пользовательские приложения, базы данных, API, источники питания блогов, формы, cookies, репозитории и переменные окружения PHP могут быть заражены данными, которые могут поставить под угрозу безопасность и нанести ущерб. В принципе, если в PHP-коде, используемом для его применения, нет вредоносных данных, то он, скорее всего, будет «полезной нагрузкой». Это предполагает, что: a) был написан оригинальный PHP-код; b) он был правильно отредактирован; и c) он не был оплачен преступной организацией.

Использование источника данных без обеспечения полной безопасности и пригодности данных для использования может сделать его открытым для атак. Также необходимо убедиться, что полученные данные соответствуют отправленным. Серьезные проблемы могут также возникнуть, если данные не будут полностью защищены для вывода. Все это можно выразить в виде правил ‘valid input, escaped output’ в PHP.

Это очевидные источники данных, которые необходимо каким-то образом проверить. Источники также могут включать хранилище на стороне клиента. Например, большинство приложений идентифицируют пользователей, присваивая им уникальный идентификатор сессии, который хранится в файле cookie. Если злоумышленник получит значения из cookie, он может выдать себя за другого пользователя. Хотя это может снизить некоторые риски, связанные с перехватом и изменением пользовательских данных, это не может гарантировать физическую безопасность компьютера пользователя. Он не может гарантировать, что пользователи будут считать ‘123456’ самым нелепым паролем со времен ‘password’. Еще больше усложняет ситуацию тот факт, что куки в настоящее время являются не единственной формой хранения данных на стороне пользователя.

ЧИТАТЬ ЕЩЁ:  Firewall - не панацея

Еще один риск, который часто упускается из виду, касается целостности исходного кода. В PHP все более распространенной становится разработка приложений на основе большого количества слабо связанных библиотек, модулей и пакетов фреймворка. Многие из них загружаются из публичных репозиториев, таких как Github, и устанавливаются с помощью программ установки пакетов, таких как Composer или его онлайн-компаньон Packagist.org. Поэтому безопасность исходного кода полностью зависит от безопасности всех этих сторонних служб и компонентов. Если Github будет взломан, он может быть использован для распространения кода, содержащего вредоносные плагины. В случае с Packagist.org злоумышленники могут перенаправлять запросы пакетов на свои собственные вредоносные пакеты.

В настоящее время и Composer, и Packagist.org уязвимы к известным уязвимостям в обнаружении зависимостей и распространении пакетов, поэтому всегда проверяйте все в производственной среде и проверяйте источник всех пакетов на Packagist.org.

Как я могу остановить их?

Нарушить безопасность веб-приложения до смешного просто, но очень трудоемко. Можно с уверенностью предположить, что в каждом веб-приложении где-то есть уязвимость. Причина проста. Все приложения создаются людьми, а люди совершают ошибки. Идеальная безопасность — это мечта летней ночи. Все приложения могут содержать уязвимости, и задача разработчика — минимизировать риск.

Следует тщательно рассмотреть вопрос о снижении потенциального ущерба от атак на веб-приложения. Попутно описываются возможные методы атаки. Некоторые из них очевидны, другие — нет. Однако для решения этой проблемы необходимо учитывать некоторые основные принципы безопасности.

Основные принципы безопасности

При разработке защиты ее эффективность может быть оценена на основе следующих соображений. Некоторые из них уже обсуждались выше.

  1. Не доверяйте никому и ничему.
  2. Всегда предполагайте худший вариант развития событий.
  3. Реализовать многоуровневую защиту (многоуровневая защита).
  4. Keep It Simple Stupid (KISS).
  5. Следуйте принципу «наименьших привилегий».
  6. Злоумышленники улавливают двусмысленность.
  7. Читайте документацию (RTFM). Но никогда не доверяйте этому.
  8. Если он не был протестирован, он не будет работать.
  9. Вы всегда несете ответственность!

1. не доверяйте никому!

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

2. всегда предполагать наихудший сценарий развития событий

Большинство систем безопасности имеют одну общую особенность: они разработаны таким образом, чтобы быть в состоянии справиться с нарушением работы приложения. Независимо от того, насколько они хороши в них, всегда есть возможность нарушить каждую из них. Учитывая это, преимущества второго пункта могут быть реализованы немедленно. Ориентация на наихудший сценарий помогает оценить масштаб и злонамеренный характер атаки. А если это все-таки произойдет, вы сможете смягчить последствия с помощью дополнительных защитных мер и архитектурных изменений. Возможно, традиционные решения, которые вы используете, уже заменены более совершенными?

3. использовать многоуровневую защиту (защита в глубину)

Защита заимствована из военной науки, потому что люди давно поняли, что многочисленные стены, мешки с песком, транспортные средства, пуленепробиваемые жилеты и бутылки, закрывающие жизненно важные органы от враждебных сфер и лезвий, являются адекватным подходом к обеспечению безопасности. Никогда не знаешь, что из вышеперечисленного не защитит тебя. Несколько уровней защиты должны позволить вам полагаться на одно укрепленное поле или боевой порядок. Конечно, это не просто индивидуальная неудача. Представьте, что нападающий взбирается на огромную средневековую стену с лестницей, обнаруживает, что за ним находится другая стена, и получает стрелу. Хакер будет чувствовать то же самое.

4. будь проще, глупее (поцелуй)

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

5. придерживается принципа «меньше привилегий».

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

6. злоумышленники чуют двусмысленность.

Безопасность путем непрозрачности» основана на предположении, что если вы используете защиту А, то она волшебным образом служит вам, потому что атакующий находится в тупике относительно того, что это такое, как она работает и существует ли она вообще. На самом деле, это дает вам лишь небольшое преимущество. Во многих случаях опытный злоумышленник сможет понять, какие шаги вы предприняли, поэтому вам необходимо использовать явные средства защиты. Тех, кто слишком убежден, что явная защита отменяет необходимость фактической защиты, следует специально наказывать, чтобы лишить их иллюзий.

7. читайте документацию (RTFM). Но никогда не доверяйте этому.

Руководство по PHP — это Библия. Конечно, она не была написана летающей макарониной, поэтому технически она может содержать полуправду, недостатки, недоразумения или ошибки, которые еще не были замечены или исправлены. То же самое относится и к переполнению стека.

В целом, специальные источники мудрости безопасности (ориентированные как на PHP, так и на PHP) дают более подробные знания. Ближе всего к библии по безопасности PHP находится сайт OWASP, на котором представлены статьи, руководства и советы. Если что-то в OWASP не рекомендует это делать — никогда не делайте этого!

8. не будет функционировать, если не будет проверен.

Ввод защиты требует создания всех тестов, необходимых для проверки работы. Это включает в себя притворство, что вы — плачущая тюрьма хакеров. Это может показаться натяжкой, но изучение способов взлома онлайн-приложений является хорошей практикой. Вы узнаете о возможных уязвимостях, и ваша паранойя возрастет. При этом нет необходимости рассказывать руководству о своей недавно приобретенной репутации взломщика онлайн-приложений. Используйте автоматизированные инструменты для обнаружения уязвимостей. Они полезны, но, конечно, не могут заменить даже надлежащие обзоры кода и ручное тестирование приложения. Чем больше у вас ресурсов для тестирования, тем надежнее будет ваше приложение.

9. всегда виноват ты!

Разработчики привыкли считать, что безопасность можно обрести с помощью разрозненных атак, последствия которых несущественны.

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

В то же время, атаки на безопасность часто представляют собой комбинацию атак. По отдельности они не имеют большой ценности, но иногда они прокладывают путь для других атак. Например, для SQL-инъекции может потребоваться определенное имя пользователя. Это можно получить с помощью временной атаки на интерфейс управления, а не с помощью гораздо более дорогого и заметного перебора. С другой стороны, SQL-инъекция позволяет проводить XSS-атаки на определенные учетные записи администраторов, не привлекая внимания большим количеством подозрительных записей в журнале.

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

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

Валидация входа — это внешний защитный периметр для онлайн-заявок. Она защищает лежащую в основе бизнес-логику, обработку данных и результаты. Буквально все за пределами этого периметра, кроме кода, выполняющего текущее приложение, считается вражеской зоной. Все мыслимые входы и выходы по периметру охраняются днем и ночью военными охранниками, которые сначала стреляют, а потом допрашивают. Периметр соединен с индивидуально охраняемыми (и очень подозрительными) «союзниками», включая модели, базы данных и файловые системы. Никто не хочет стрелять в них, но если они попытаются обречь себя на гибель… Бам. У каждого союзника есть свои границы, которые могут доверять или не доверять нашим границам.

ЧИТАТЬ ЕЩЁ:  Дядя Гугл великан

Помните, что я говорил о том, кому можно доверять? Никого. В мире PHP есть совет не доверять «вводу пользователя». Это категория, основанная на доверии. Предположение о том, что пользователю не доверяют, предполагает, что доверяют всему остальному. Неправда. Пользователи, очевидно, являются наименее надежным источником информации, поскольку мы их не узнаем и не контролируем.

Критерии валидации

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

Фильтр проходит без проблем. Проблема заключается в том, что полученный URL php:// может быть передан в функцию PHP. Функция ожидает получить удаленный HTTP-адрес (через обработчик PHP), а не данные, лежащие в основе исполняемого файла PHP. Эта уязвимость возникает из-за отсутствия способа ограничить допустимые URI в параметрах фильтрации. Однако приложение ожидает ссылки http, https или mailto, а не URI, специфичные для PHP. Такого слишком обобщенного подхода к валидации следует избегать.

Обратите внимание на контекст.

Проверка ввода должна предотвращать ввод небезопасных данных в веб-приложение. Одно из основных препятствий: проверка безопасности данных обычно проводится только для первого предполагаемого использования.

Предположим, вы получаете данные, содержащие имена. Довольно легко проверить наличие апострофов, тире, скобок, пробелов и различных буквенно-цифровых символов Unicode. Имя — это действительные данные, которые могут быть использованы для отображения (первое предполагаемое использование). Однако если вы используете его в другом месте (например, в запросе к базе данных), он становится новым контекстом. Кроме того, некоторые из символов, принятых в имени, могут оказаться опасными в данном контексте: когда имя преобразуется в строку для выполнения SQL-инъекции.

Проверка ввода оказывается ненадежной по своей сути. Эффективнее вырезать явно недопустимые значения. Например, если что-то должно быть целым числом, буквенно-цифровой строкой или HTTP URL. Эти форматы и значения имеют свои собственные ограничения и при надлежащем контроле представляют меньшую угрозу. Другие значения (простой текст, массивы GET/POST, HTML) труднее проверить, и они с большей вероятностью содержат вредоносные данные.

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

Помимо проверки входных данных, очень распространенным методом защиты является экранирование. Безопасность данных можно проверить при входе в новый контекст. Этот метод обычно используется для защиты от межсайтового скриптинга (XSS), но также применяется в качестве инструмента фильтрации во многих других задачах.

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

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

Используйте только белые, а не черные списки

Черные и белые списки — это два основных подхода к валидации ввода. Проверяются недействительные данные из черного списка и проверяется белый список действительных данных. Белые каталоги предпочтительнее, потому что в них запускаются только те данные, которые, как ожидается, будут проверены. Черный список, с другой стороны, рассматривает дело разработчика по всем неверным данным, поэтому его гораздо легче запутать, получить или ошибиться.

Хорошим примером является процедура валидации, разработанная для обеспечения безопасности HTML в отношении незащищенных выходов на стандарты. При использовании черного списка необходимо убедиться, что в HTML нет опасных элементов, функций, стилей и исполняемого JavaScript. Это очень много задач, и инструментам очистки HTML на основе черных списков всегда удается избежать обнаружения опасных комбинаций кода. Функции белого списка устраняют эту двусмысленность, разрешая только известные легальные элементы и функции. Все остальные, какими бы они ни были, изолированы, обособлены или удалены.

Поэтому белые списки предпочтительнее любого процесса валидации из-за их безопасности и надежности.

Не пытайтесь изменять входные данные

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

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

Последствия усилий по модификации входных данных: злоумышленники могут предсказать последствия модификаций. Предположим, у вас есть недопустимое строковое значение. Вы ищете его, удаляете и завершаете фильтрацию. Но что произойдет, если злоумышленник создаст разделительное значение, чтобы обмануть фильтр?

В этом примере простая фильтрация на основе меток ничего не дает. Удаление явной метки приводит к тому, что данные рассматриваются как полностью валидный элемент действия HTML. То же самое относится и к фильтрации по определенному формату. Это иллюстрирует, почему не рекомендуется выполнять проверку входов в последнем защитном цикле приложения.

Вместо того чтобы пытаться исправить запись, примените валидатор на основе белого цвета и отбрасывайте такие попытки входа вообще. И где бы ни возникла необходимость в фильтрации, всегда фильтруйте перед проверкой и никогда после.

Никогда не доверяйте внешним инструментам проверки для отслеживания уязвимостей

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

HTML-формы умеют накладывать ограничения на вводимые данные. Вы можете ограничить параметры с помощью списков фиксированных элементов, установить минимальные и максимальные значения и ограничить длину текста. Возможности HTML 5 еще более расширены. Leafletters может проверять URL-адреса и адреса электронной почты, а также даты, числа и строки (хотя поддержка последних двух функций довольно временная). Браузеры также могут проверять вводимые пользователем данные с помощью обычных выражений JavaScript, содержащихся в стандарте.

Не следует забывать обо всем этом богатстве контрольных данных. Их цель — улучшить удобство использования приложения. Захватчики могут создавать формы, которые не содержат ограничений исходной формы. Они даже могут создать HTTP-клиента для автоматического заполнения формы!

ЧИТАТЬ ЕЩЁ:  Два источника World Wide Web

Другим примером внешнего инструмента проверки является получение данных из API третьей стороны, например, Twitter. Эта социальная сеть имеет хорошую репутацию, и мы обычно ей доверяем. Однако, хотя мы и параноики, нам не стоит доверять даже Twitter. В случае взлома его ответы будут содержать незащищенные данные, к которым мы не готовы. Поэтому даже здесь применяйте собственную проверку, чтобы не оказаться незащищенным, если что-то случится.

Если вы уверенно работаете с внешними инструментами проверки, вы можете легко отслеживать уязвимости. Например, если HTML-форма устанавливает порог максимальной длины и получает входные данные, размер которых достигает предела, разумно предположить, что пользователь пытается обойти проверку. Таким образом, можно предпринять дальнейшие действия против возможных атак, фиксируя дыры во внешних инструментах и ограничивая количество доступа или приложений.

Избегайте преобразования типов в PHP

PHP не является строго стандартизированным языком, и большинство его возможностей и функций безопасно не стандартизированы. Это может привести к серьезным проблемам. Более того, они не особенно уязвимы для ценовых ВАЛЬДЕРОВ. Например:.

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

Этого никогда не следует делать:

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

Преобразование типов было улучшено во многих функциях и функциях, таких как in_array(), которая часто используется для проверки наличия допустимых необязательных значений в массивах.

Типы проверки данных

Ошибки валидации ввода могут привести к уязвимостям и повреждению данных. В следующих примерах мы рассмотрим различные типы валидации на примере PHP.

Валидация типа данных.

Просто проверьте такие типы данных, как строка, целое число, плавающая точка и массив. Поскольку большое количество данных вводится через формы, такие функции PHP, как is_int(), нельзя использовать вслепую. В конце концов, значение является строкой и может достигать максимального целочисленного значения, поддерживаемого PHP. Не проявляйте излишнюю изобретательность и не используйте регулярные выражения регулярно, так как это нарушает принцип KISS.

Проверки валидности символов

Убедитесь, что строка содержит только допустимые символы. Большинство функций PHP являются функциями ctype; более продвинутыми являются регулярные выражения. Если требуются только символы ASCII, следует использовать функцию ctype.

Проверка формата.

Это гарантирует, что данные соответствуют определенному допустимому набору символов. Яркими примерами являются электронные письма, URL-адреса и даты. Лучше всего использовать функцию filter_var() в PHP, класс DateTime и другие формы регулярных выражений. Чем сложнее формат, тем более надежные инструменты следует использовать для проверки формата и синтаксиса.

Проверьте ограничения.

В этом разделе проверяется, находятся ли значения в допустимых пределах. Например, должны приниматься только значения больше 5, от 0 до 3 или не равные 34. Проверки ограничений также могут применяться к строкам, размерам файлов, разрешениям изображений, диапазонам дат и т.д.

Проверка наличия данных

Проверьте, имеются ли все данные, необходимые для дальнейшей работы. Например, в регистрационной форме это логины, пароли и адреса электронной почты. Если что-то отсутствует, данные считаются неверными.

Соответствие данных.

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

Проверка логики.

Это, по сути, проверка на ошибки и требует, чтобы полученные данные не привели к ошибке или исключению в приложении. Например, подстановка строки восстановления в регулярное выражение может привести к ошибке синтаксиса выражения. Также в зоне риска находятся целые числа, превышающие определенное значение, нули в знаменателе операций деления или нечетные значения, такие как +0, 0 или -0.

Проверьте доступность ресурсов.

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

Верификация источников входного сигнала

Несмотря на наши усилия, валидация входа не решает всех проблем безопасности. Во многих случаях пользовательский ввод не может быть надежно проверен. Это возможно, если приложение работает с источником данных, который считается надежным (например, локальная база данных). В случае с базами данных существует не так много дополнительных видов проверок. Однако возьмем пример удаленной веб-службы, защищенной с помощью SSL или TLS. Примером может служить запрос информации из API через HTTPS.

HTTPS является важным средством защиты от атак типа «человек посередине» (MITM), когда злоумышленник становится посредником между двумя точками обмена данными. Такой посредник выдает себя за сервер. Другими словами, клиент думает, что он подключен к серверу. На самом деле, именно злоумышленник устанавливает еще одно соединение с запрашиваемым сервером. Злоумышленник передает данные в обоих направлениях и может прочитать их без ведома клиента или сервера. Кроме того, посредник может изменить данные во время передачи.

Чтобы предотвратить такие атаки, злоумышленнику необходимо описать сервер и не дать ему возможности прочитать сообщения, которыми обмениваются сервер и клиент. Для этого существует протокол SSL/TLS, который выполняет две основные функции безопасности

  1. Он шифрует все передаваемые данные с помощью общего ключа, доступ к которому могут иметь только клиент и сервер.
  2. Сервер должен быть идентифицирован с помощью открытого сертификата и закрытого ключа, выданных доверенным лицом и признанных клиентом.

Широко распространено мнение, что одного шифрования достаточно для защиты от таких атак, и многие приложения и библиотеки не используют второй шаг. Это распространенная и легко обнаруживаемая уязвимость в приложениях с открытым исходным кодом. По неустановленной причине PHP сам отключает контроль сервера над HTTPS-оберткой при использовании stream_socket_client(), fsockopen() или других внутренних функций. Например:.

Здесь очевидна уязвимость промежуточной атаки. Данные из этого HTTPS-запроса не считаются полученными от требуемой службы. Разумно, что приложение должно запускаться с проверкой сервера.

UPD: В PHP 5.6+ опция ssl.verify_peer по умолчанию имеет значение true.

Расширение Curl включает проверку сервера из коробки, поэтому ничего настраивать не нужно. Однако разработчики могут бездумно относиться к безопасности библиотек и своих приложений. Этот подход можно найти в любой библиотеке, от которой зависит приложение.

Отключение проверки сервера в SSL-фреймах или использование curl_setopt () создает уязвимость для атаки «человек посередине». Однако это не позволяет решить вопрос о том, что назойливая ошибка указывает на атаку, или только на то, что приложение пытается взаимодействовать с хостом, чей SSL-сертификат был неправильно настроен или просрочен.

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

Заключение.

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

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

Оцените статью