Пълното ръководство (v2) Най-добри практики - Yii рамка на украинската общност

По-долу ще разгледаме основните принципи за сигурност и ще опишем как да избягваме заплахи, когато разработваме с Yii.

Основни принципи #

Има два основни принципа за сигурност, независимо какво приложение се разработва:

  1. Филтриране на входа.
  2. Бягство от изхода.

Входно филтриране #

Филтрирането на въвеждане означава, че въвеждането никога не трябва да се счита за безопасно и винаги трябва да проверявате дали въвеждането е валидно. Например, ако знаем, че сортирането може да се извърши само на трите полета title, created_at и status и полето може да бъде предадено чрез въвеждане от потребителя, по-добре е да проверим стойността там, където сме я получили:

В Yii най-вероятно ще използвате валидиране на формуляр, за да направите този вид валидиране.

Бягство от изхода #

Как да избегнете SQL инжекции #

SQL инжектиране се случва, когато текстът на заявката се формира чрез конкатениране на неекранирани низове, както е показано по-долу:

Вместо да предостави правилното потребителско име, атакуващият може да предаде нещо като '; DROP TABLE потребител; -- . Полученият SQL ще бъде:

Повечето заявки към база данни в Yii се случват чрез Active Record, който правилно използва вътрешно подготвени PDO заявки. Когато използвате подготвени заявки, не е възможно да манипулирате заявката, както е показано по-горе.

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

Ако данните се използват като имена на колониили таблици, най-добрият начин е да разрешите само предварително дефиниран набор от стойности:

Ако това не е възможно, имената на колони и таблици трябва да бъдат екранирани. Yii използва специален синтаксис за екраниране за всички поддържани бази данни:

Можете да получите подробна информация за синтаксиса в Имената на екраниращи таблици и колони.

Как да избегнем XSS #

Избягването на XSS е лесно в Yii. На мястото на извеждане на текст трябва да изберете една от двете опции:

  1. Искате да показвате данни в обикновен текст.
  2. Искате да извеждате данни като HTML.

Ако трябва да покажете обикновен текст, тогава е по-добре да избягате, както следва:

Ако трябва да изведете HTML, по-добре използвайте HtmlPurifier:

Имайте предвид, че обработката с HtmlPurifier е доста тежка, така че е добра идея да помислите за кеширане.

Как да избегнем CSRF#

CSRF е акроним за Cross-Site Request Forgery. Идеята е, че много приложения приемат, че заявките, идващи от браузъра, се изпращат от потребителя. Това може да не е вярно.

За да избегнете CSRF, винаги трябва:

  1. Следвайте HTTP спецификациите, например GET заявка не трябва да променя състоянието на приложението.
  2. Поддържайте CSRF защитата на Yii активирана.

Как да избегнете нежелан достъп до файлове #

По подразбиране webroot на сървъра сочи към уеб директорията, където се намира index.php. В случай на използване на споделен хостинг, това може да не е постижимо, в крайна сметка целият код, конфигурации и регистрационни файлове може да се озоват в webroot на сървъра.

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

Как да избегнем извеждането на информация за отстраняване на грешки и инструменти в производството #

В режим на отстраняване на грешки Yii показва доста подробни грешки, които са полезни по време на разработката. Въпросът е, че многословните грешки са удобни за нападателя, тъй като могат да разкрият структурата на базата данни, настройките на конфигурацията и части от вашия код. Никога не стартирайте приложения в производствен режим с YII_DEBUG, зададен на true във вашия index.php.

Никога не трябва да активирате панела Gii или Debug, докато сте в производство. Това може да се използва за получаване на информация за структурата на базата данни, кода и може да ви позволи да замените файлове, генерирани автоматично от Gii.

Използване на защитена връзка през TLS#

Yii предоставя функции, които зависят от бисквитки и/или PHP сесии. Те могат да бъдат уязвими, ако връзката ви е компрометирана. Рискът е намален, ако приложението използва защитена връзка през TLS (често наричана SSL).

Вижте документацията за вашия уеб сървър за инструкции за конфигуриране. Можете също така да проверите примерите за конфигурация, предоставени от проекта H5BP:

Конфигурация на защитен сървър #

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

Как да избегнете атака от тип заглавка на хост #

Класове като yii\web\UrlManager и yii\helpers\Url могат да използват исканото име на хост] за генериране на връзки. Ако уеб сървърът е конфигуриран да обслужва един и същ сайт, независимо от стойността на заглавката Host, тази информацияможе да не се вярва и може да бъде подправен от потребителя, който прави HTTP заявката. В такива ситуации трябва или да коригирате конфигурацията на вашия уеб сървър, за да обслужва сайта само до посочените имена на хостове, или изрично да зададете или филтрирате стойността, като зададете свойството hostInfo на компонента на приложението за заявка.

За повече информация относно конфигурацията на сървъра вижте документацията за вашия уеб сървър:

Ако нямате достъп до конфигурацията на сървъра, можете да настроите филтър на ниво приложение yii\filters\HostControl, за да се предпазите от този вид атака:

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