HTTP - протокол. Как защитить себя?

1766759780975.webp


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


Что вообще такое HTTP?

HTTP расшифровывается как Hypertext Transfer Protocol. Это, грубо говоря, переписка между твоим браузером и серваком. Работает он по простой схеме: запрос и ответ. А теперь поподробнее:
  1. Твой браузер отправляет сообщение серверу, формируя запрос. Сообщение звучит примерно так - "Мне нужен такой то ресурс, страница, картинка, или видеоролик. Пришли мне его." Вообще это может быть что угодно, от небольшого документа до огромного 4к видоса. То есть запрос - это то, что ты просишь у сервера, на котором хранятся эти данные.
  2. Сервер получает запрос от браузера, и начинает искать, с целью как можно быстрее найти то, что ты у него попросил. В этот момент он формирует ответ, содержащий запрошенный ресурс. Помимо этого есть еще кое-что: статус. Статус - это результат операции: 200 - все четко, запрос выполнен, 404 - ошибка, нет ничего, что соответствует твоему запросу. 500 - сервер умер, что то пошло не так, придется попробовать позже.
С этим разобрались, теперь поговорим про его компоненты:

1. URL: адрес ведущий к конкретному ресурсу в интернете. Он расшифровывается как "Uniform Resource Locator" и состоит из:
  1. Протокола ( https:// )
    https:// - это зашифрованное соединение, довольно важное для защиты данных.
  2. Названия сервера ( /page.html )
    В данном случае, это путь к файлу page.html, который предположительно находится в корневой директории веб-сервера.
2. Заголовки: метаданные, которые передаются вместе с запросом и ответом. Это скрытый язык обмена, который позволяет клиенту и серваку согласовывать параметры общения.

Они содержат вот такую информацию:

Content-Type - Тип данных, которые передаются, по типу text/html, image/jpeg и т.д. Это критически важно для адекватной интерпретации данных.

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

Accept-Language - Язык ответа.

User-agent - Информация о твоем браузере и операционке.

Cookie - те самые печеньки, разрешить которые просит тебя чуть ли не каждая страница в интернете. Это небольшие текстовики, хранящиеся на стороне клиента, содержащие инфу о твоей сессии. Если куки не защищены должным образом, они становятся источником твоих личных данных для злоумышленников.

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

3. Методы: А вот это уже другая история. Если говорить простыми словами, методы - это инструкции, которые клиент дает серверу.

Быстро пройдемся по ним:

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

POST - Так отправляются данные на сервер для обработки. В отличии от предыдущего метода, данные передаются в теле запроса, что в теории безопаснее, чем GET, но... это только в теории. все равно надо зашифровать.

PUT - Замена уже имеющегося ресурса. Ну если твои данные требуется так сказать, освежить.

DELETE - Удаление ресурса. Но не все так просто - этот метод захочет повышенной аутентификации и авторизации.

PATCH - Частичное обновление ресурса. Чтобы не менять полностью, в случае с PUT.

OPTIONS - Твоя палочка-выручалочка, которая расскажет какие методы ты сможешь применить.


4. Статус-коды: те самые числа, которыми сервер отчитывается тебе по итогу операции. Я уже говорил про парочку из них ранее, но теперь копнем глубже:

200 OK - О нем ты уже слышал, он означает успех операции.

301 Moved Permanently - Ресурс перманентно перемещен на другой URL.

302 Found - В этом случае ресурс переместили не перманентно, а временно, но суть та же.

400 Bad Request - Неправильно указан запрос, значит где-то напортачили.

401 Unauthorized - Недостаточно прав, нужна аутентификация.

403 Forbidden - Доступ запрещен, даже после аутентификации.

404 Not Found - Ресурс не найден. Дефолтная ошибка, о ней ты тоже уже знаешь.

500 Internal Server Error - Какие-то траблы с сервером. Забудь о ней, пока не появится сообщение об ошибке.

503 Service Unavailable - Сервис временно недоступен, ничего не поделаешь.



Итак, HTTP. Протокол, на котором держится весь интернет. Красиво звучит. Но по факту он - дырявый как решето. И если ты думаешь, что тут ничего такого, просто поставил SSL и все - то ты глубоко ошибаешься. К чему это я? Ну вот ты теперь знаешь, что вообще такое этот HTTP, а про потенциальные угрозы - нет. Пора исправлять.

1766759990720.webp


Вот что мы имеем:

MITM - man in the middle, то есть буквально человек посередине.

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

Так, понятно, а как решать проблему будем? HTTPS - кто-то сейчас скажет. А если у тебя нет контроля над сервером? А что если ты используешь публичный Wi-Fi? Ну вот смотри, приведу пример:

Допустим ты сидишь на публичном Wi-Fi.
  1. Злоумышленник запускает точку доступа с тем же SSID, что и публичное кафе или аэропорт.
  2. Жертвы подключаются, думая, что это легитимный интернет.
  3. Внутри сети злоумышленник использует Bettercap или Aircrack-ng для ARP Spoofing.
  4. Перехватывает весь трафик - собирает логи, куки, просматривает незащищенные данные.
Вот тебе база данных личных данных, паролей и сессионных токенов на руках у негодяя.

(Этот пример я взял из статьи про MITM-атаки у своего коллеги по форуму, кто хочет копнуть глубже в тему, ознакомьтесь обязательно - MITM‑атаки: полное практическое руководство 2025).

Что ты можешь предпринять:

Certificate Pinning: Если ты создаешь приложение, воткни в него сертификаты. Теперь твоя приложуха будет проверять, равен ли сертификат, сервера, тому, что ты установил. Если нет - серверу будет отказано. Это конечно сложно, зато довольно эффективно. Плюс - меньше геморроя со сторонними сертификационными центрами, которые не редко грешат поддельными сертификатами.

HSTS: То, что было бы славно включить на своем сайте. Он расшифровывается вот так - HTTP Strict Transport Security. Это означает, что у тебя есть неплохая возможность защитить своих пользователей. Это строгий начальник, который заставит браузер всегда использовать HTTPS для доступа на страницу, даже если пользователь случайно ввел HTTP-адрес.

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


Окей, с этим разобрались. Идем дальше - XSS.

Что же такое XSS? Расшифровка такова - Cross-Site Scripting. Это тип уязвимости, который дает возможность плохому парню внедрить вредоносный, чаще всего JS код на твой сайт. Этот код будет выполняться в браузере пользователя, когда он посетит страницу, в которой скрипт обосновался.

Теперь по порядку - как это все происходит:
  1. Хакер находит место на твоем сайте, куда можно ввести данные, которые не проходят валидацию и экранирование. Это может быть поле формы, комментарий и т.д.
  2. Потом заносит скрипт.
  3. Пользователь посещает зараженную страницу.
Контроль получен.

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

Обычно ему присваивают разные типы:

Stored XSS - это когда скрипт сохраняется например, в БД и отображается всем, кто заходит на страницу. Этот сценарий происходит в худшем случае.

Reflected XSS - передача скрипта через запрос (URL) и выполняется только для человека, который отправил запрос.

DOM-based XSS - в этом случае код выполняется в браузере, манипулируя DOM, то есть информацией страницы.

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

Но куда же без экранирования. Экранирование - это процесс замены определенных символов в данных на их безопасные эквиваленты. Просто если они не экранированы, браузер может прочитать не текст, как планировалось, а код. Это открывает новые возможности для атакующего.
Ну вот представь, что человек вводит в поле формы: <script>alert("какой-нибудь текст")</script>
Если ты выведешь это на страницу, браузер выполнит такой код, и появится всплывающее окно с текстом. Экранирование не дает такому произойти. Оно заменит символы < и > на их эквиваленты, чтобы браузер отобразил этот код в виде текста, а не выполнял его.
Главное не забудь, что у каждого контекста свой метод экранирования. Для этого существуют HTML, JavaScript, URL, и CSS escaping.

Что у нас тут еще... Ага CSP - тот самый фейс-контрольщик, который стоит на входе в твой сайт и проверяет, кому можно входить и что можно делать. В общем ты создаешь определенный список источников, с которых можно качать тот или иной ресурс. Если при загрузке окажется, что источника нет в этом списке - отказ в загрузке. Хорошая вещь, хоть и полностью она тебя не защитит, зато гемора хацкеру добавит.


С XSS покончено, но это еще не конец, теперь на очереди SQL Injection.

Представь, что ты сидишь пишешь обычную программку, которая позволяет пользователю искать товары по названию. Берешь ты значит ввод пользователя, добавляешь его в SQL запрос и отправляешь в базу данных. Все логично. Но если этот гений введет не название товара, а, "'; DROP TABLE products; --", то все, ГГ, запрос превратится в снос всей твоей таблицы с товарами, над которой ты так долго старался. И все, потому что ты не продумал, как обрабатывать ввод пользователя. Что-то напоминает...

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

Как же защититься? Решение есть - параметризованные запросы. Они позволяют отделить данные от кода. Вместо того, чтобы напрямую вставлять пользовательский ввод в запрос, ты передаешь его как параметр. БД обрабатывает этот параметр как данные, а не как код. Это спасает тебя от выполнения опасного SQL-кода.


Дальше интереснее: Cross-Site Request Forgery, можно просто - CSRF.

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

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

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

Как они работают?
  1. Каждый раз, когда ты заходишь на сайт, сервер генерит рандомный код, который и называется CSRF токеном.
  2. Он добавляется в каждое поле, задуманное под изменение состояния на сервере.
  3. Когда ты отправляешь форму, сервер проверяет, равен ли токен, который ты отправил, токену, который он сгенерировал для тебя на входе. Если они совпадают, значит, запрос был отправлен тобой. Если нет - непорядок, кто-то пытается подделать запрос, и сервер должен послать его куда подальше.
В идеале, если токен будет храниться в HTTP-only cookie - это значит, что он недоступен для JS, что в разы добавит геморроя атакующему.


Ну все, ты вооружен ценной информацией, осталось напоследок по-быстрому разобраться с самим HTTPS.

HTTPS - это тот же HTTP, но с шифрованием. Он использует протоколы SSL/TLS для шифрования данных. Значит данные, которые передает браузер и сервер, зашифрованы и никто не сможет их перехватить. Чтобы это все работало сервер должен иметь SSL/TLS сертификат. Этот сертификат - пруф того, что сервер не самозванец. Браузер проверит сертификат, чтобы убедиться в его валидности.

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab