Просто е — следвайте правилото за струните на Вил

Манипулирането на низове изглежда по-лесно, отколкото е в действителност, и погрешното извършване може да създаде сериозни проблеми със сигурността. Например, конструирането на SQL заявка от потребителски вход чрез поставянето й в шаблон гарантирано ще въведе „SQL инжекция“.

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

Идеите, които обсъждам в тази история, са подходящи за всички езици за програмиране с общо предназначение от Java и C# през JavaScript и Python до Haskell и Elm. Без значение как или какво програмирате, ще се натъкнете на тези проблеми. Не искам да ограничавам тази дискусия само до един език и затова не давам примерен код на нито един език.

Какво е правилото на Вил за струните?

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

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

Научих това правило от моя приятел и бивш колега д-р Виле Тиронен от университета в Ювяскюля; Тук просто го перифразирах малко. Наричам го Правилото на Вил за струните.

Има очевидно следствие от правилото на Вил:

Не манипулирайте низове във вашето приложение.

Правилото за низове на Ville е вдъхновено от анти-модела на синтактичния анализ на пушка,описан от общността на теорията на езика за сигурност (langsec). Предлаганите средства за защита обаче са малко по-различни. Вярвам, че правилото на Ville е по-лесно за прилагане на практика от повечето разработчици, докато подходът langsec е по-подходящ за експерти, работещи на платформи, библиотеки и рамки.

Как можете да свършите нещо, като следвате правилото на Вил?

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

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

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

Прилагане на правилото за низовете на Ville в приложение за блогове

Ключова част от машината за блогове прави запитване към базата данни за част от текста — обикновено в HTML или на някакъв друг език за маркиране — и го поставя в HTML шаблон, създавайки страницата, която се изпраща до уеб браузъра на читателя.

Следователно този модул има една входна информация — URL адресът, идентифициращ страницата, която трябва да се покаже. URL адресът съдържа следната интересна информация:

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

Човек може да подходи към този проблем, като предаде URL адреса и накара всяко парче код да извлече каквато и да е информация, от която се нуждае, тъй като има нужда от нея. Това би било нарушение на Правилото за струните на Виле. Не само това, той разпръсква код, който трябва да разбере как информацията е била кодирана в URL адреса в цялата програма, което прави по-трудно да запомните да ги промените всички, когато форматът се промени.

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

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

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

Добър начин да положите тази допълнителна грижа е да направите поставянето на съдържание като операция на разумни структури от данни, вместо просто да свързвате низове. Каноничната структура на данните за представяне на съдържанието на HTML е „Документен обектен модел (DOM).“ По този начин ще съхраним както шаблона, така и публикацията в блога като DOM дървета и ще вмъкнем DOM публикацията в блога като поддърво в шаблона DOM. Тогава това, което остава да направим, е да сериализираме — наричано още разборване — DOM в низ, който след това можем да изпратим до браузъра.

Този дизайн не само елиминира опасностите от SQL инжектиране, но също така намалява повърхността на атака, свързана с повреден HTML — тъй като, разбира се, DOM сериализацията няма да създаде повреден HTML.

Заключение

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

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

Като приложен програмист, моля, избягвайте низовете, доколкото можете.

Ресурси