инструмент symfonyписане на защитени уеб приложения

symfonyписане

Автор: Валентин Удалцов, студент от катедра „Информационна сигурност“ „Висше училище по икономика“

Сред задачите, решавани от съвременните бекенд рамки на PHP, има три основни:

  1. Организиране на удобна среда за разработка, която разчита на изпитани във времето модели на програмиране.
  2. Предоставяне на набор от надеждни инструменти за решаване на общи задачи на уеб приложенията.
  3. Намаляване на разходите за писане на защитен код, въвеждане на сигурни правила за разработка.

Защита срещу XSS атаки

Основният проблем на шаблоните е избягването на променливи HTML специални знаци, тоест трансформирането на специалните знаци, използвани от езика за маркиране, в безопасни еквивалентни конструкции.

Показването на предоставени от потребителя данни в шаблон без правилно екраниране създава риск от XSS атака. Нападателят има възможност да използва зловреден код от страна на други клиенти.

Несигурен код

Основно решение

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

Решение в Symfony

Symfony използва модула за шаблони Twig. В допълнение към факта, че Twig предоставя огромен брой удобни инструменти за организиране на шаблони, той задава определени правила за извеждане на променливи. По-специално, с настройките по подразбиране, Twig избягва специалните знаци по подразбиране:

Защита от SQL инжектиране

SQL инжекциите са възможни, ако променливите не са екранирани при заместване на данни в кода на заявката.

Несигурен код

Основно решение

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

Symfony използва проект на трета страна Doctrine за работа с базата данни.

Основният компонент, Doctrine DBAL (Database Abstraction Layer), прави възможно бързото и удобно заместване на скритите данни в тялото на заявката.

С тази библиотека можете също да създадете заявка, използвайки OOP:

Този подход елиминира появата на неочаквани конструкции в заявката. Ако някое структурно правило за конструиране на заявка е нарушено, библиотеката генерира грешка на ниво PHP, а не на ниво SQL анализатор. Това изолира данните от грешни заявки.

Библиотеката Doctrine ORM също е интегрирана в стандартния сборник на Symfony, което ви позволява да работите не със самата SQL заявка или нейния конструктор, а директно с PHP обекти. Класовете на модела се маркират по определен начин (например с помощта на анотации в phpDoc), в резултат на което свойствата на обектите се проектират върху колоните на таблиците в базата данни. Взаимодействието между обект и ред в базата данни (създаване, редактиране, изтриване) става автоматично чрез добре установени механизми, което освен че увеличава скоростта на разработка, минимизира възможността за грешки.

Валидиране на входящи данни

Формулярите са неразделна част от уеб приложение. PHP е свободно типизиран език, така че валидирането от страна на сървъра и преобразуването на входящите данни в типове е особено важно.остър въпрос.

Основно решение

Има много подходи за валидиране на входящи данни. Всички те използват прости функции като is_numeric, in_array, filter_var, preg_match за съвпадение на тип или шаблон. Основната трудност се състои в разработването на интегрален универсален подход за валидиране на формуляри, който ще игнорира ненужните параметри, ще контролира необходимите, доколкото е възможно, и ще върне чисти, безопасни данни или грешка след обработка.

Подход за валидиране на формуляр в Symfony

Освен това Symfony ви позволява да маркирате модели (чиито свойства се попълват от входящи данни след обработка на заявката) с различни валидатори и след това да получите масив от грешки в няколко реда код.

Symfony има CSRF защита, активирана по подразбиране. CSRF токен се добавя автоматично към всички формуляри, уникален за всеки потребител. При получаване на отговор рамката първо проверява получения токен с токена от сесията.

Удостоверяване

Удостоверяването е процедура за удостоверяване. Неговата основна и всъщност единствена задача е да идентифицира потребителя.

Уеб приложението е система за заявка-отговор. В тази връзка, в контекста на уеб приложение, идентификацията може да се разбира като установяване на връзка едно към едно между текущата заявка и определен потребителски обект (например ред в базата данни в потребителската таблица).

От горното следва, че в частта за удостоверяване на приложението всяка заявка трябва да бъде удостоверена. За да направите това, по подразбиране на всички потребители се дава, например, етикетът anonymous, който временно е техният идентификатор в системата.

Удостоверяване в Symfony

Упълномощаване

Упълномощаване в Symfony

Symfony използвазадължителен принцип на контрол на достъпа. Всеки потребител има свое място в йерархията на ролите; за всеки ресурс можете да посочите кои роли имат достъп до него.

  1. Идентифициране на искания ресурс и дефиниране на роли за достъп до него
  2. Проверка дали ролята на потребителя отговаря на посочените изисквания
  3. Отговор: грешка (недостатъчни права) или продължаване на изпълнението на скрипта за генериране на отговор

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

Специално внимание в Symfony се обръща на криптографията. Чрез конфигурацията за потребителския клас може да се дефинира всеки тип криптиране на парола:

Заключение

Важно е да се разбере, че в допълнение към внедряването на самите механизми, общата архитектура на рамката е от голямо значение, което задължава разработчика да следва определени канони на дизайна.

Препоръки

Въпреки големия брой забележителни PHP рамки, познавам хора, които все още „преоткриват собствените си велосипеди“. За съжаление, когато се работи върху големи проекти със сложна бизнес логика, е невъзможно да се балансира успешно между писането на инструменти за разработка и прилагането на тази логика.

Според мен е много по-правилно да проучите някоя доста популярна уеб рамка (Symfony, Yii, Laravel, Zend и т.н.) и да се съсредоточите върху самия проект. Това ще ви позволи да разрешите повечето от потенциалните проблеми със сигурността с един замах и значително ще стесните кръга от възможни грешки.