Ця стаття є першою в серії публікацій, які я пишу про використання різних продуктів і веб-сайтів SaaS за останні 8 років. Я поділюся деякими проблемами, з якими я мав справу, уроками, які я засвоїв, помилками, яких я зробив, і, можливо, кількома речами, які пішли правильно. Дозвольте мені знати, що ти думаєш!
Ще в 2019 чи 2020 році я вирішив переписати весь бекенд для Блок відправника, програма SaaS, яка серед інших функцій допомагає користувачам створювати кращі блоки електронної пошти. У процесі я додав кілька нових функцій і перейшов на більш сучасні технології. Я провів тести, розгорнув код, вручну перевірив усе у виробництві, і, за винятком кількох випадкових негараздів, усе, здавалося, працює чудово. Хотілося б, щоб ця історія закінчилася, але…
Через кілька тижнів я отримав сповіщення від клієнта (що само по собі соромно), що служба не працює, і вони отримують багато електронних листів, які слід було б заблокувати, у свою папку "Вхідні", тож я перевірив це. Багато разів ця проблема виникає через те, що Google видаляє зв’язок із нашої служби з обліковим записом користувача, що система обробляє, сповіщаючи користувача електронною поштою та просячи його повторно підключитися, але цього разу це було щось інше.
Схоже, серверний робочий механізм, який перевіряє електронні листи на блоки користувачів, продовжував збої кожні 5-10 хвилин. Найдивніше – у журналах не було помилок, з пам’яттю все гаразд, але ЦП час від часу стрибав у, здавалося б, випадкові моменти. Тож протягом наступних 24 годин (з 3-годинною перервою на сон – вибачте, клієнти 😬) мені доводилося вручну перезапускати воркер кожного разу, коли він виходив з ладу. З якоїсь причини служба Elastic Beanstalk занадто довго чекала на перезапуск, тому мені довелося зробити це вручну.
Налагодження проблем у виробництві – це завжди біль, особливо тому, що я не міг відтворити проблему локально, не кажучи вже про те, щоб зрозуміти, що її спричиняє. Тож, як будь-який «хороший» розробник, я тільки почав реєструватися все і чекав, поки сервер знову вийде з ладу. Оскільки ЦП періодично стрибає, я припустив, що це не проблема макросу (наприклад, коли у вас не вистачає пам’яті), а, ймовірно, спричинена певною електронною адресою чи користувачем. Тому я спробував звузити його:
- Чи виникав збій на певному ідентифікаторі чи типі електронної пошти?
- Чи був збій для даного клієнта?
- Чи відбувалися збої через певні проміжки часу?
Після багатогодинного перегляду журналів довше, ніж хотілося б, зрештою я звузив коло до конкретного клієнта. Звідси простір пошуку трохи звузився – швидше за все, це було правило блокування або певний електронний лист, який наш сервер постійно намагався отримати. На моє щастя, це було перше, що є набагато легшою проблемою для усунення помилок, враховуючи, що ми дуже зосереджені на конфіденційності та не зберігаємо та не переглядаємо дані електронної пошти.
Перш ніж перейти до конкретної проблеми, давайте спершу поговоримо про одну з функцій Block Sender. У той час у мене було багато клієнтів, які просили блокувати шаблони підстановки, що дозволило б їм блокувати певні типи адрес електронної пошти, які дотримувалися того самого шаблону. Наприклад, якщо ви хочете заблокувати всі електронні листи з маркетингових електронних адрес, ви можете використати символ підстановки marketing@*
і він блокував би всі електронні листи з будь-якої адреси, яка починається з marketing@
.
Одна річ, про яку я не подумав, це те, що не всі розуміють, як працюють символи підстановки. Я припускав, що більшість людей використовуватимуть їх так само, як я, як розробник, використовуючи один *
для представлення будь-якої кількості символів. На жаль, цей конкретний користувач припустив, що вам потрібно використовувати один символ підстановки для кожного символу, який потрібно знайти. У їхньому випадку вони хотіли заблокувати всі електронні листи з певного домену (це є рідною функцією Block Sender, але вони, мабуть, цього не усвідомлювали, що само по собі є цілою проблемою). Тому замість використання *@example.com
, вони використовували **********@example.com
.
POV: спостереження за використанням вашої програми вашими користувачами…
Для обробки символів підстановки на нашому робочому сервері ми використовуємо бібліотеку Node.js матч, який допомагає зіставляти glob, перетворюючи його на регулярний вираз. Тоді ця бібліотека перетвориться **********@example.com
у щось на зразок наступного регулярного виразу:
/[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*@example.com/i
Якщо у вас є досвід роботи з регулярними виразами, ви знаєте, що вони можуть дуже швидко стати дуже складними, особливо на рівні обчислень. Зіставлення наведеного вище виразу з будь-якою розумною довжиною тексту стає дуже дорогим з точки зору обчислень, що призвело до того, що ЦП на нашому робочому сервері перевантажувався. Ось чому сервер виходить з ладу кожні кілька хвилин; він би застряг, намагаючись зіставити складний регулярний вираз з електронною адресою. Тож щоразу, коли цей користувач отримував електронний лист, на додаток до всіх повторних спроб, які ми створили для обробки тимчасових збоїв, це приводило до збою нашого сервера.
Отже, як я це виправив? Очевидно, швидким рішенням було знайти всі блоки з декількома символами узагальнення та виправити їх. Але мені також потрібно було краще очистити введені користувачем дані. Будь-який користувач може ввести регулярний вираз і зруйнувати всю систему за допомогою a ReDoS атака.
Ознайомтеся з нашим практичним практичним посібником із вивчення Git з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди Git і фактично вчитися це!
Обробка цього конкретного випадку була досить простою – видаліть послідовні символи підстановки:
block = block.replace(/*+/g, '*')
Але це все одно залишає додаток відкритим для інших типів ReDoS-атак. На щастя, є кілька пакунків/бібліотек, які також допомагають нам із цими типами:
Використовуючи комбінацію наведених вище рішень та інші засоби захисту, я зміг запобігти повторенню цього. Але це було хорошим нагадуванням, що ви ніколи не можете довіряти введеним користувачами, і ви завжди повинні дезінфікувати їх перед використанням у своїй програмі. Я навіть не знав, що це потенційна проблема, поки це не сталося зі мною, тож, сподіваюся, це допоможе комусь іншому уникнути тієї ж проблеми.
Маєте запитання, коментарі чи хочете поділитися власною історією? Протягнути руку Twitter!
- Розповсюдження контенту та PR на основі SEO. Отримайте посилення сьогодні.
- PlatoData.Network Vertical Generative Ai. Додайте собі сили. Доступ тут.
- PlatoAiStream. Web3 Intelligence. Розширення знань. Доступ тут.
- ПлатонЕСГ. вуглець, CleanTech, Енергія, Навколишнє середовище, Сонячна, Поводження з відходами. Доступ тут.
- PlatoHealth. Розвідка про біотехнології та клінічні випробування. Доступ тут.
- джерело: https://stackabuse.com/behind-the-scenes-never-trust-user-input/
- : має
- :є
- : ні
- $UP
- 1
- 20
- 2019
- 2020
- 24
- 8
- a
- Здатний
- МЕНЮ
- вище
- рахунки
- насправді
- доданий
- доповнення
- адреса
- адреси
- знову
- проти
- ВСІ
- дозволяти
- тільки
- Також
- завжди
- серед
- an
- та
- будь-який
- додаток
- додаток
- ЕСТЬ
- стаття
- AS
- запитувач
- передбачається
- At
- нападки
- уникнути
- знати
- Backend
- BE
- Бобове стебло
- стає
- було
- перед тим
- за
- за лаштунками
- буття
- Краще
- Біт
- Блокувати
- блокування
- блоки
- border
- Перерва
- побудований
- але
- by
- CAN
- Може отримати
- який
- випадок
- викликаний
- викликаючи
- певний
- характер
- символи
- контроль
- код
- поєднання
- коментарі
- компанія
- комплекс
- складний
- обчислювальна
- зв'язку
- виправити
- може
- міг
- Крах
- Розбився
- Гуркіт
- створювати
- клієнт
- Клієнти
- дані
- справа
- вирішене
- розгорнути
- Розробник
- DID
- А не було
- do
- домен
- Дон
- вниз
- два
- кожен
- легше
- ще
- повідомлення електронної пошти
- кінець
- що закінчився
- закінчується
- Що натомість? Створіть віртуальну версію себе у
- Весь
- помилки
- особливо
- Навіть
- врешті-решт
- Кожен
- все
- все
- приклад
- дорогий
- досвід
- вираз
- збої
- достатньо
- далеко
- особливість
- риси
- кілька
- Рисунок
- розібрався
- знайти
- кінець
- Перший
- виправляти
- Сфокусувати
- потім
- після
- для
- Колишній
- від
- отримати
- отримання
- GIF
- Git
- даний
- добре
- великий
- керівництво
- було
- обробляти
- Ручки
- практичний
- сталося
- Відбувається
- Мати
- допомога
- допомагає
- З надією
- ГОДИННИК
- hover
- Як
- HTTPS
- i
- ID
- if
- in
- включені
- вхід
- замість
- в
- питання
- питання
- IT
- сам
- робота
- просто
- збережений
- Знати
- останній
- пізніше
- вчений
- вивчення
- довжина
- Уроки
- дозволяти
- рівень
- LG
- бібліотека
- як
- Ймовірно
- ll
- локально
- каротаж
- Довго
- довше
- подивився
- багато
- Macro
- made
- вручну
- багато
- Маркетинг
- матч
- узгодження
- може бути
- me
- пам'ять
- хвилин
- помилки
- сучасний
- сучасні технології
- більше
- найбільш
- багато
- множинний
- повинен
- вузький
- рідний
- необхідний
- ніколи
- Нові
- Нові можливості
- наступний
- немає
- вузол
- Node.js
- повідомлення
- номер
- Шанси
- of
- on
- ONE
- відкрити
- or
- Інше
- наші
- з
- власний
- Біль
- частина
- приватність
- Викрійки
- Люди
- plato
- Інформація про дані Платона
- PlatoData
- Пости
- потенціал
- Практичний
- запобігати
- ймовірно
- Проблема
- процес
- Production
- Продукти
- питань
- Швидко
- швидко
- досить
- випадковий
- RE
- досягати
- зрозумів,
- причина
- розумний
- отримано
- возз'єднатися
- regex
- регулярний
- нагадування
- видаляти
- видалення
- представляти
- право
- кільце
- Правило
- прогін
- біг
- s
- SaaS
- гарантії
- то ж
- сцени
- Пошук
- здавалося
- мабуть
- відправника
- Серія
- сервер
- обслуговування
- тінь
- Поділитись
- поділ
- лист
- Повинен
- простий
- з
- сон
- So
- Рішення
- деякі
- Хтось
- що в сім'ї щось
- Простір
- конкретний
- шип
- Stackabuse
- стандартів
- почалася
- Як і раніше
- Стоп
- зберігати
- Історія
- система
- Приймати
- балаканина
- Технології
- тимчасовий
- перевірений
- Тести
- текст
- ніж
- Що
- Команда
- їх
- Їх
- потім
- Там.
- Ці
- вони
- річ
- речі
- думати
- це
- час
- times
- до
- занадто
- перехід
- намагався
- Довіряйте
- намагається
- ПЕРЕГЛЯД
- Поворот
- тип
- Типи
- розумієш
- на жаль
- до
- підвищений
- us
- використання
- використовуваний
- користувач
- користувачі
- використання
- різний
- Ve
- дуже
- через
- вид
- Очікування
- хотіти
- хотів
- було
- wasn
- спостереження
- шлях..
- we
- веб-сайти
- тижня
- ДОБРЕ
- пішов
- були
- Що
- коли
- який
- всі
- чому
- Вікіпедія
- бажання
- з
- Work
- робочий
- робочий
- б
- лист
- років
- Ти
- вашу
- зефірнет