Backend
3.95K subscribers
36 photos
710 links
Комьюнити Backend программистов.
Python, Java, Golang, PHP, C#, C/C++, DevOps

Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Download Telegram
📌 Что такое полиморфизм?

💬 Спрашивают в 25 % собеседований

Полиморфизм – это один из фундаментальных принципов объектно-ориентированного программирования (ООП), который позволяет объектам разного типа обрабатывать данные по-разному, используя один и тот же интерфейс. Основная идея полиморфизма заключается в том, что метод или функция могут принимать объекты разных классов и корректно выполнять для них свою работу, не зная их конкретного типа заранее.

🤔 Основные виды полиморфизма:

1️⃣ Полиморфизм подтипов (ад-хок полиморфизм):

Это форма полиморфизма, при которой функция или метод могут быть применены к аргументам разных типов. В ООП это достигается через наследование и интерфейсы. Классический пример – это использование базового класса или интерфейса, когда конкретная реализация определяется в дочерних классах. Пример: метод draw() может быть определен в интерфейсе Shape, а конкретная реализация этого метода – в классах Circle, Square, Triangle.

2️⃣ Параметрический полиморфизм (универсальный полиморфизм):

Это форма полиморфизма, при которой функции или методы могут работать с любыми типами данных. Обычно это реализуется через использование обобщенных типов (generics). Например, в языке Java или C# можно создать класс или метод, который работает с любым типом данных, используя синтаксис шаблонов (generics).

3️⃣ Полиморфизм времени выполнения (динамический полиморфизм):

Это форма полиморфизма, при которой метод конкретного объекта выбирается во время выполнения программы. Обычно это достигается с помощью виртуальных функций и механизма позднего связывания (late binding). Пример: вызов метода move() у объекта, который может быть как автомобилем, так и самолетом. Виртуальная функция обеспечивает вызов правильной реализации метода в зависимости от реального типа объекта.

🤔 Зачем нужен полиморфизм:

1️⃣ Упрощение кода и повышение его гибкости:

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

2️⃣ Повышение уровня абстракции:

Полиморфизм позволяет программистам думать о более высокоуровневых концепциях, не углубляясь в детали реализации конкретных классов. Это делает код более понятным и легким для восприятия.

3️⃣ Поддержка принципа "открытости/закрытости" (Open/Closed Principle):

Полиморфизм помогает следовать этому принципу, который гласит, что "программные сущности (классы, модули, функции) должны быть открыты для расширения, но закрыты для изменения". То есть, для добавления новых функциональностей не нужно изменять существующий код, достаточно создать новый подкласс или реализовать новый интерфейс.

4️⃣ Снижение дублирования кода:

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

🤔 Краткий ответ:

Полиморфизм – это принцип ООП, позволяющий объектам разных типов обрабатывать данные через единый интерфейс, обеспечивая гибкость, расширяемость и упрощение кода.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Какой фреймворк Python используется для разработки веб-приложений и API?
Anonymous Quiz
97%
Django
1%
NumPy
2%
Pandas
0%
SciPy
Как событийно-ориентированные архитектуры повышают масштабируемость и отзывчивость приложений

Событийно-ориентированные архитектуры (Event-Driven Architectures, EDA) используют события для коммуникации между различными компонентами системы, что позволяет строить масштабируемые и отзывчивые приложения. В этом посте мы рассмотрим, как такие архитектуры, с примерами использования Kafka и RabbitMQ, могут повысить эффективность приложений.

Преимущества событийно-ориентированных архитектур


Отзывчивость: EDA позволяют незамедлительно реагировать на события в реальном времени, что критично для приложений, требующих быстрой обработки данных (например, в финансовых технологиях или системах мониторинга).
Расширяемость: Системы могут масштабироваться путём добавления обработчиков событий, что облегчает горизонтальное масштабирование.
Разделение и изоляция компонентов: Событийно-ориентированные системы часто приводят к созданию микросервисов, каждый из которых выполняет свою функцию, реагируя на события, что уменьшает зависимости между компонентами.

Примеры использования Kafka и RabbitMQ


Kafka

Apache Kafka — это распределённая платформа для обработки потоков данных, которая широко используется для построения надёжных, масштабируемых и высокопроизводительных систем. Kafka хорошо подходит для:

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

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

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Producer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("bank-transactions", "transactionId", "transactionDetails"));
producer.close();


RabbitMQ

RabbitMQ — это популярный брокер сообщений, используемый для межпроцессного взаимодействия с использованием шаблонов очередей. Он подходит для:

Децентрализованных систем: RabbitMQ позволяет отделить производителя данных от потребителя, что упрощает масштабирование и обеспечивает надёжность.

Пример: Онлайн-ретейлер использует RabbitMQ для обработки заказов, где один сервис принимает заказы, а другой обрабатывает платежи и обновляет складские запасы.

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='orders')

channel.basic_publish(exchange='', routing_key='orders', body='Order details')
print(" [x] Sent 'Order details'")

connection.close()


Как EDA улучшает масштабируемость и отзывчивость


Независимое масштабирование: Компоненты могут масштабироваться независимо, так как они взаимодействуют друг с другом через события, не требуя постоянного соединения.

Асинхронное взаимодействие: Системы не блокируются в ожидании ответов, что позволяет увеличить пропускную способность и сократить время отклика.

Устойчивость к отказам: События могут быть повторно обработаны в случае сбоев, что повышает надёжность системы.

Заключение


Событийно-ориентированные архитектуры, использующие инструменты, такие как Kafka и RabbitMQ, предоставляют значительные преимущества для разработки масштабируемых и отзывчивых приложений. Они обеспечивают гибкость в управлении данными и процессами, повышая эффективность и производительность системы. Освоение этих технологий может значительно улучшить архитектурное строение современных приложений.
📌 Из чего состоит запрос на сервере?

💬 Спрашивают в 20 % собеседований

Запрос на сервере состоит из нескольких ключевых компонентов, которые обеспечивают передачу данных и инструкций от клиента к серверу. Веб-запросы, особенно в контексте HTTP, обычно включают следующие элементы:

1️⃣ Стартовая линия (Request Line):

Метод: Определяет тип запроса и действия, которые должен выполнить сервер. Основные методы включают:

GET: Запрос на получение данных с сервера.

POST: Отправка данных на сервер для обработки (например, форма).

PUT: Замена существующего ресурса на сервере.

DELETE: Удаление ресурса с сервера.

PATCH: Частичное обновление ресурса.

URI (Uniform Resource Identifier): Указывает путь к ресурсу на сервере.

Версия протокола HTTP: Определяет используемую версию HTTP, например, HTTP/1.1.

2️⃣ Заголовки (Headers):

Метаданные, которые предоставляют дополнительную информацию о запросе. Примеры заголовков:

Host: Указывает имя хоста и, возможно, номер порта сервера (например, www.example.com).

User-Agent: Информация о клиентском приложении, совершающем запрос (например, браузер).

Accept: Типы данных, которые клиент готов принять (например, text/html, application/json).

Content-Type: Тип данных, передаваемых в теле запроса (например, application/json для JSON данных).

Authorization: Информация для аутентификации, если запрос требует авторизации.

3️⃣ Тело запроса (Body):

Содержит данные, отправляемые на сервер. Тело запроса используется в методах POST, PUT, PATCH для передачи данных, таких как формы, файлы или JSON-объекты. Для методов GET и DELETE тело запроса обычно не используется.

🤔 Зачем нужны эти компоненты:

1️⃣ Метод и URI:

Метод определяет действие, которое клиент хочет выполнить, а URI указывает конкретный ресурс, к которому это действие применяется. Это основа понимания сервером того, что именно клиент запрашивает.

2️⃣ Заголовки:

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

3️⃣ Тело запроса:

Тело запроса содержит основное содержание, которое клиент хочет передать на сервер. Например, данные формы, JSON-объекты или файлы. Без тела запроса невозможно передать на сервер данные, которые необходимо обработать.

🤔 Пример HTTP-запроса:
POST /submit-form HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

name=John+Doe&age=30


В этом примере:

Стартовая линия указывает метод POST, ресурс /submit-form и версию протокола HTTP/1.1.

Заголовки включают Host, User-Agent, Content-Type и Content-Length.

Тело запроса содержит закодированные данные формы.

🤔 Краткий ответ:

Запрос на сервере состоит из стартовой линии (метод, URI, версия HTTP), заголовков (метаданные) и тела запроса (данные). Эти компоненты работают вместе, чтобы передать инструкции и данные от клиента к серверу.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Какой фреймворк используется для разработки веб-приложений на языке Ruby?
Anonymous Quiz
79%
Ruby on Rails
1%
Sinatra
4%
Hanami
17%
Все вышеперечисленные
Обзор принципов работы WebSockets, сценарии использования и как это может улучшить пользовательский опыт в реальном времени

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

Принципы работы WebSockets


Установление соединения

Взаимодействие начинается с обычного HTTP-запроса от клиента, который включает заголовок Upgrade. Если сервер поддерживает WebSockets, он отвечает подтверждением и соединение обновляется до WebSocket протокола.

Пример запроса:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13


Пример ответа:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=


Двусторонний обмен данными

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

Данные передаются в виде фреймов, которые могут быть текстовыми, бинарными или контрольными.

Поддержка низкой задержки

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

Закрытие соединения

Соединение WebSocket можно закрыть с любой стороны, отправив специальный контрольный фрейм. Это гарантирует, что обе стороны могут корректно завершить взаимодействие.

Сценарии использования WebSockets


Чат-приложения

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

Пример: Реализация простой системы чата на Node.js с использованием библиотеки ws.

const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });

server.on('connection', socket => {
socket.on('message', message => {
console.log(`Received: ${message}`);
// Рассылаем сообщение всем подключенным клиентам
server.clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
});
});

console.log('WebSocket server is running on ws://localhost:8080');


Реалтайм обновления данных

В приложениях, таких как торговые платформы или трекеры спортивных событий, данные должны обновляться в режиме реального времени.

Пример: Обновление котировок акций в режиме реального времени на биржевом терминале.

Коллаборативные инструменты

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

Пример: Совместное редактирование текста в Google Docs, где все изменения моментально отображаются у всех участников.

Как WebSockets улучшают пользовательский опыт


Мгновенная обратная связь

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

Снижение нагрузки на сервер

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

Экономия трафика

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

Поддержка сложных взаимодействий

WebSockets позволяют реализовать сложные взаимодействия в реальном времени, такие как совместная работа, игры и торговые платформы, обеспечивая плавный и интерактивный пользовательский опыт.
1
📌 Какие есть статус коды?

💬 Спрашивают в 20 % собеседований

Статус коды HTTP используются для обозначения результата обработки запроса сервером. Они делятся на пять категорий, каждая из которых имеет свое предназначение:

1️⃣ Информационные (100-199)

Эти коды указывают, что запрос был получен и продолжается его обработка.

100 Continue: Сервер получил начальную часть запроса клиента и ожидает продолжения.

101 Switching Protocols: Клиент запросил изменение протокола, и сервер согласен выполнить это.

2️⃣ Успешные (200-299)

Эти коды сообщают, что запрос успешно принят, понят и обработан.

200 OK: Запрос успешно обработан, и сервер отправляет запрашиваемые данные.

201 Created: Запрос успешно выполнен, и в результате был создан новый ресурс.

202 Accepted: Запрос принят для обработки, но обработка еще не завершена.

204 No Content: Запрос успешно выполнен, но сервер не возвращает никаких данных.

3️⃣ Перенаправления (300-399)

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

301 Moved Permanently: Запрашиваемый ресурс был окончательно перемещен на новый URI.

302 Found: Запрашиваемый ресурс временно доступен по другому URI.

304 Not Modified: Данные не изменились, клиент может использовать кэшированную версию.

4️⃣ Клиентские ошибки (400-499)

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

400 Bad Request: Сервер не может обработать запрос из-за ошибки клиента (например, неверный синтаксис).

401 Unauthorized: Для доступа к запрашиваемому ресурсу требуется аутентификация.

403 Forbidden: У клиента нет прав на доступ к запрашиваемому ресурсу.

404 Not Found: Запрашиваемый ресурс не найден на сервере.

405 Method Not Allowed: Метод, указанный в запросе, не поддерживается данным ресурсом.

5️⃣ Ошибки сервера (500-599)

Эти коды указывают на ошибки на стороне сервера при обработке запроса.

500 Internal Server Error: Общая ошибка сервера, когда обработка запроса не может быть завершена.

501 Not Implemented: Сервер не поддерживает функциональность, необходимую для обработки запроса.

502 Bad Gateway: Сервер, выполняющий роль шлюза или прокси, получил недействительный ответ от вышестоящего сервера.

503 Service Unavailable: Сервер временно не доступен (например, из-за перегрузки или технического обслуживания).

504 Gateway Timeout: Сервер, выполняющий роль шлюза или прокси, не дождался ответа от вышестоящего сервера вовремя.

🤔 Краткий ответ:

Статус коды HTTP делятся на пять категорий:

1️⃣ Информационные (100-199)

2️⃣ Успешные (200-299)

3️⃣ Перенаправления (300-399)

4️⃣ Клиентские ошибки (400-499)

5️⃣ Ошибки сервера (500-599)

Эти коды позволяют клиенту понять результат обработки запроса и предпринимать соответствующие действия.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой из следующих пакетов используется для сериализации данных в формат JSON в Python?
Anonymous Quiz
2%
sys
92%
json
3%
requests
2%
os
Преимущества перехода на GraphQL для управления данными

В мире современных веб-технологий GraphQL выделяется как мощный инструмент для управления данными, который предлагает гибкий и эффективный способ взаимодействия между клиентами и серверами. Разработанный Facebook, GraphQL решает многие проблемы, с которыми разработчики сталкиваются при использовании REST API, предоставляя более динамичный и оптимизированный способ запросов к данным. Давайте рассмотрим ключевые преимущества GraphQL.

1. Точное получение необходимых данных


Проблема REST: Клиенты часто получают либо недостаточно данных, что требует дополнительных запросов, либо слишком много неиспользуемых данных.

Решение GraphQL: GraphQL позволяет клиентам точно указывать, какие данные им нужны. Это уменьшает избыточность и повышает эффективность, поскольку сервер возвращает только те данные, которые требуются.

query {
user(id: "1") {
name
email
friends {
name
}
}
}


В этом примере клиент запрашивает имя и email пользователя, а также имена его друзей, что невозможно сделать одним запросом в типичном REST API без предварительной настройки на сервере.

2. Уменьшение количества запросов


Проблема REST: Для получения связанных данных часто требуется несколько запросов.

Решение GraphQL: С GraphQL можно получить все нужные данные в одном запросе, даже если они распределены по разным ресурсам. Это особенно ценно в мобильной разработке, где каждый дополнительный запрос может значительно увеличить время ответа из-за медленного соединения.

query {
user(id: "1") {
name
posts {
title
comments {
text
}
}
}
}


Этот запрос позволит получить пользователя, его посты и комментарии к постам одним запросом.

3. Типизация и самодокументируемость


Проблема REST: Отсутствие строгой типизации и необходимость внешней документации.

Решение GraphQL: GraphQL использует строгую систему типов, которая гарантирует согласованность данных. Каждое API описывается схемой, которая служит также в качестве документации. Это упрощает разработку и интеграцию систем.

type User {
id: ID!
name: String!
email: String
posts: [Post]
}

type Post {
id: ID!
title: String!
comments: [Comment]
}

type Comment {
id: ID!
text: String!
}


Эта схема не только определяет структуру данных, но и является отличным документационным ресурсом для разработчиков.

4. Улучшенная производительность


Проблема REST: Отправка избыточных данных увеличивает нагрузку на сеть.

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

Заключение


Переход на GraphQL может значительно улучшить взаимодействие клиент-сервер в ваших приложениях, сделав запросы данных более гибкими, эффективными и удобными для разработчиков. Уменьшение избыточности данных, снижение количества запросов, система типов и самодокументирование делают GraphQL мощным инструментом для современной разработки веб-приложений.
👍1
📌 Чем отличаются LEFT JOIN от INNER JOIN?

💬 Спрашивают в 19 % собеседований

LEFT JOIN и INNER JOIN – это два типа соединений (joins) в языке SQL, которые используются для объединения строк из двух или более таблиц на основе связанных столбцов. Основное различие между ними заключается в том, какие строки включаются в результирующий набор данных.

🤔 INNER JOIN

INNER JOIN возвращает только те строки, которые имеют совпадающие значения в обеих таблицах, участвующих в соединении.

Особенности:

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

Если нет совпадающих значений, строка не будет включена в результирующий набор.

Пример:

Предположим, у нас есть две таблицы: Employees и Departments.
SELECT Employees.name, Departments.department_name
FROM Employees
INNER JOIN Departments ON Employees.department_id = Departments.id;


Этот запрос вернет только тех сотрудников, у которых есть совпадающий департамент в таблице Departments.

🤔 LEFT JOIN

LEFT JOIN возвращает все строки из левой таблицы (первой таблицы в запросе) и соответствующие строки из правой таблицы. Если в правой таблице нет совпадающих строк, в результирующем наборе будут NULL значения для столбцов правой таблицы.

Особенности:

Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы.

Если в правой таблице нет соответствия, возвращаются NULL значения для правой таблицы.

Пример:

Используем те же таблицы Employees и Departments.
SELECT Employees.name, Departments.department_name
FROM Employees
LEFT JOIN Departments ON Employees.department_id = Departments.id;


Этот запрос вернет всех сотрудников, включая тех, у кого нет соответствующего департамента в таблице Departments. Для таких сотрудников столбцы из таблицы Departments будут содержать NULL значения.

🤔 Сравнение:

1️⃣ INNER JOIN:

Возвращает только совпадающие строки.

Если нет совпадений, строки не включаются в результат.

2️⃣ LEFT JOIN:

Возвращает все строки из левой таблицы.

Включает совпадающие строки из правой таблицы.

Если нет совпадений, строки из правой таблицы будут заполнены NULL значениями.

🤔 Краткий ответ:

INNER JOIN возвращает только совпадающие строки из обеих таблиц.

LEFT JOIN возвращает все строки из левой таблицы и соответствующие строки из правой таблицы, заполняя NULL, если совпадений нет.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой пакет используется для работы с протоколом HTTP в Go?
Anonymous Quiz
87%
net/http
7%
io
4%
bufio
1%
log
Современные угрозы безопасности для backend систем и методы их предотвращения

Безопасность backend систем — одна из ключевых задач в разработке приложений, особенно в условиях постоянно растущих угроз. В этом посте мы рассмотрим самые распространенные угрозы безопасности для backend систем и обсудим методы их предотвращения, которые помогут вам защитить ваше приложение и данные пользователей.

1. SQL-инъекции


Описание угрозы: SQL-инъекции происходят, когда злоумышленник вставляет вредоносный SQL-код в запросы к базе данных. Это может привести к несанкционированному доступу, модификации или удалению данных.

Пример атаки:


SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = 'password';


Если запрос не защищен, злоумышленник может войти в систему без ввода пароля.

Методы предотвращения:

Используйте подготовленные выражения (prepared statements) и параметризированные запросы.
Ограничьте права доступа к базе данных, предоставляя только необходимые разрешения.

Пример на Python с использованием подготовленных выражений:

cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))


2. XSS (Межсайтовый скриптинг)


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

Пример атаки:

<script>alert('XSS');</script>


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

Методы предотвращения:

Всегда экранируйте входные данные, прежде чем отображать их на странице.
Используйте Content Security Policy (CSP) для ограничения выполнения скриптов.

Пример использования экранирования в Node.js:

const escapeHtml = require('escape-html');
app.get('/comment', (req, res) => {
const safeComment = escapeHtml(req.query.comment);
res.send(`<div>${safeComment}</div>`);
});


3. CSRF (Межсайтовая подделка запросов)


Описание угрозы: CSRF-атаки заставляют пользователя выполнять нежелательные действия на сайте, на котором он аутентифицирован, без его ведома.

Пример атаки:

<img src="https://example.com/transfer?amount=1000&to=attacker_account" />


Если пользователь аутентифицирован, этот запрос может перевести деньги на счет злоумышленника.

Методы предотвращения:

Используйте CSRF-токены для всех форм и запросов, изменяющих состояние системы.
Ограничьте выполнение критически важных действий на уровне сервера, проверяя источник запросов.

Пример защиты с использованием CSRF-токена в Django:

<form method="post" action="/transfer/">
{% csrf_token %}
<input type="text" name="amount">
<input type="submit" value="Transfer">
</form>


В следующем посте разберем оставшиеся угрозы 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Что такое SQL?

💬 Спрашивают в 25 % собеседований

SQL (Structured Query Language) — это язык запросов, предназначенный для управления и манипулирования данными в реляционных базах данных. SQL используется для выполнения различных операций над данными, таких как создание, изменение, удаление и извлечение данных.

🤔 Основные возможности SQL

1️⃣ Создание и изменение структуры базы данных:

DDL (Data Definition Language): Команды, которые позволяют создавать и изменять структуру базы данных, включая таблицы, индексы, представления и другие объекты базы данных.

CREATE: Создание новых таблиц, баз данных, индексов.

ALTER: Изменение структуры существующих объектов базы данных.

DROP: Удаление объектов из базы данных.

2️⃣ Управление данными:

DML (Data Manipulation Language): Команды, которые используются для управления данными в базе данных.

SELECT: Извлечение данных из таблиц.

INSERT: Вставка новых данных в таблицы.

UPDATE: Обновление существующих данных в таблицах.

DELETE: Удаление данных из таблиц.

3️⃣ Управление доступом к данным:

DCL (Data Control Language): Команды, которые управляют доступом пользователей к данным в базе данных.

GRANT: Предоставление прав пользователям.

REVOKE: Отзыв ранее предоставленных прав.

4️⃣ Транзакции:

TCL (Transaction Control Language): Команды, которые управляют транзакциями в базе данных.

COMMIT: Сохранение всех изменений, сделанных в транзакции.

ROLLBACK: Отмена всех изменений, сделанных в транзакции.

🤔 Пример использования SQL

Для иллюстрации возможностей SQL рассмотрим несколько простых примеров команд.

Создание таблицы:
CREATE TABLE Employees (
id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT,
salary DECIMAL(10, 2)
);


Вставка данных в таблицу:
INSERT INTO Employees (id, name, department_id, salary)
VALUES (1, 'John Doe', 10, 50000.00);


Извлечение данных из таблицы:
SELECT name, salary
FROM Employees
WHERE department_id = 10;


Обновление данных в таблице:
UPDATE Employees
SET salary = 55000.00
WHERE id = 1;


Удаление данных из таблицы:
DELETE FROM Employees
WHERE id = 1;


🤔 Зачем нужен SQL

1️⃣ Управление данными: SQL предоставляет мощные средства для извлечения, вставки, обновления и удаления данных, что позволяет эффективно управлять данными в больших объемах.

2️⃣ Определение структуры данных: С помощью SQL можно создавать и изменять структуру базы данных, обеспечивая гибкость в управлении схемой данных.

3️⃣ Управление доступом: SQL позволяет контролировать доступ к данным, обеспечивая безопасность и конфиденциальность информации.

4️⃣ Обеспечение целостности данных: SQL поддерживает механизмы транзакций и ограничения, которые помогают поддерживать целостность данных и предотвращать их некорректное изменение.

🤔 Краткий ответ

SQL (Structured Query Language) — это язык запросов, используемый для управления и манипулирования данными в реляционных базах данных. Он позволяет создавать, изменять, удалять и извлекать данные, а также управлять доступом и обеспечивать целостность данных.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Какой пакет используется для тестирования HTTP-клиентов в Java?
Anonymous Quiz
42%
HttpClient
16%
RestAssured
32%
JUnit
10%
Mockito
4. Угрозы безопасности через API


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

Пример атаки:

Злоумышленник может получить доступ к незащищенному API и выполнить нежелательные действия, такие как изменение данных пользователя.

Методы предотвращения:

Всегда проверяйте и аутентифицируйте все запросы к API.
Используйте шифрование данных и проверяйте права доступа к ресурсам.
Ограничьте запросы к API по IP-адресам и используйте rate limiting.

Пример использования аутентификации JWT в Express:

const jwt = require('jsonwebtoken');
const secret = 'your-secret-key';

app.post('/api/protected', (req, res) => {
const token = req.headers['authorization'];
if (!token) return res.status(401).send('Access Denied');

try {
const verified = jwt.verify(token, secret);
req.user = verified;
res.send('Protected data');
} catch (err) {
res.status(400).send('Invalid Token');
}
});


5. Уязвимости компонентов с известными уязвимостями


Описание угрозы: Использование сторонних библиотек и фреймворков, которые имеют известные уязвимости, может привести к компрометации системы.

Методы предотвращения:

Регулярно обновляйте зависимости и используйте инструменты для автоматической проверки уязвимостей (например, Snyk, Dependabot).
Проверяйте библиотеки перед их использованием и следите за сообщениями об уязвимостях.

6. Неправильная конфигурация безопасности


Описание угрозы: Ошибки конфигурации безопасности, такие как использование стандартных паролей или открытые порты, могут быть легко эксплуатированы злоумышленниками.

Методы предотвращения:

Автоматизируйте проверки конфигурации безопасности с помощью инструментов, таких как Chef InSpec или OpenSCAP.
Убедитесь, что все компоненты системы (серверы, базы данных, сети) настроены с учетом лучших практик безопасности.

Заключение


Современные угрозы безопасности представляют серьезную опасность для backend систем, но их можно эффективно предотвратить с помощью правильных подходов к разработке и эксплуатации. Использование подготовленных выражений для работы с базами данных, экранирование данных, внедрение CSRF-токенов, а также регулярное обновление зависимостей и контроль конфигурации помогут вам защитить ваши приложения и данные пользователей от большинства распространенных атак. Внедряя эти методы, вы сможете создать безопасную и устойчивую к угрозам систему.
📌 Что такое rest api?

💬 Спрашивают в 20 % собеседований

REST API (Representational State Transfer Application Programming Interface) — это архитектурный стиль для создания веб-сервисов, который использует стандартные HTTP методы и принципы для взаимодействия между клиентом и сервером. REST API предоставляет набор операций для создания, чтения, обновления и удаления ресурсов, представленных в виде URL.

🤔 Основные принципы REST API

1️⃣ Клиент-серверная архитектура:

Клиент и сервер отделены друг от друга. Клиент запрашивает ресурсы, сервер обрабатывает запросы и возвращает ресурсы или статус операции.

2️⃣ Бесподсессионное взаимодействие (stateless):

Каждое взаимодействие между клиентом и сервером независимое. Сервер не хранит состояние клиента между запросами. Вся необходимая информация для выполнения запроса должна быть предоставлена в каждом запросе.

3️⃣ Кеширование:

Ответы сервера могут быть кешированы клиентом или промежуточными звеньями (прокси-серверами) для повышения производительности и снижения нагрузки на сервер.

4️⃣ Единый интерфейс (Uniform Interface):

Универсальный интерфейс упрощает взаимодействие между клиентом и сервером. Основные методы HTTP (GET, POST, PUT, DELETE) используются для выполнения операций с ресурсами.

5️⃣ Многоуровневая система:

REST API может быть организован в виде многоуровневой системы, где компоненты выполняют разные задачи (например, балансировка нагрузки, кеширование, защита и т.д.).

6️⃣ Представление ресурсов (Representations):

Ресурсы представляются в виде различных форматов (обычно JSON или XML). Клиент и сервер могут договариваться о формате данных через заголовки HTTP (например, Content-Type и Accept).

🤔 Основные методы HTTP в REST API

GET: Извлечение данных с сервера. Например, получение информации о пользователе.

POST: Отправка данных на сервер для создания нового ресурса. Например, создание новой учетной записи пользователя.

PUT: Обновление существующего ресурса на сервере. Например, обновление информации о пользователе.

DELETE: Удаление ресурса с сервера. Например, удаление учетной записи пользователя.

PATCH: Частичное обновление ресурса на сервере. Например, изменение только email пользователя.

🤔 Пример REST API

Рассмотрим пример REST API для управления ресурсами пользователей.

Примеры URL и HTTP методов

1️⃣ Получение списка пользователей:

URL: GET /users

Описание: Возвращает список всех пользователей.

2️⃣ Получение информации о конкретном пользователе:

URL: GET /users/{id}

Описание: Возвращает информацию о пользователе с заданным ID.

3️⃣ Создание нового пользователя:

URL: POST /users

Описание: Создает нового пользователя с данными, переданными в теле запроса.

4️⃣ Обновление информации о пользователе:

URL: PUT /users/{id}

Описание: Обновляет информацию о пользователе с заданным ID с данными, переданными в теле запроса.

5️⃣ Удаление пользователя:

URL: DELETE /users/{id}

Описание: Удаляет пользователя с заданным ID.

🤔 Примеры запроса и ответа

Запрос на создание нового пользователя (POST /users):
POST /users HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "John Doe",
"email": "[email protected]"
}


Ответ на успешное создание пользователя:
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": 1,
"name": "John Doe",
"email": "[email protected]"
}


🤔 Зачем нужен REST API

1️⃣ Универсальность: REST API может быть использован с любым языком программирования, поддерживающим HTTP.

2️⃣ Масштабируемость: Простота и гибкость архитектуры REST позволяет легко масштабировать системы.

3️⃣ Производительность: Возможность кеширования ответов позволяет уменьшить нагрузку на сервер и увеличить скорость отклика.

4️⃣ Легкость интеграции: REST API часто используется для интеграции различных систем и приложений, так как он предоставляет стандартизированные методы взаимодействия.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой фреймворк на PHP используется для создания полноценных веб-приложений?
Anonymous Quiz
60%
Laravel
3%
CodeIgniter
4%
Symfony
33%
все перечисленные
Как паттерн Circuit Breaker предотвращает сбои в микросервисных архитектурах

Микросервисная архитектура предлагает множество преимуществ, но с увеличением количества сервисов возрастает риск сбоев. Паттерн Circuit Breaker помогает предотвратить каскадные отказы, обеспечивая устойчивость системы. В этом посте мы обсудим, как работает этот паттерн и как его использовать для повышения стабильности приложений.

Что такое Circuit Breaker?


Circuit Breaker (прерыватель цепи) — это механизм, который отслеживает состояние вызовов к удаленным сервисам и предотвращает их, если сервис не отвечает или работает нестабильно. Он имеет три состояния:

Closed (Замкнутый): Запросы проходят нормально. Если возникают ошибки, их количество отслеживается.

Open (Разомкнутый): Если ошибок слишком много, прерыватель размыкается, и все запросы к сервису завершаются с ошибкой, без попыток подключения.

Half-Open (Полуразомкнутый): Через некоторое время прерыватель позволяет нескольким запросам пройти к сервису. Если они успешны, прерыватель замыкается. В противном случае он снова размыкается.

Пример использования


Рассмотрим пример на Java с использованием библиотеки Resilience4j:

import io.github.resilience4j.circuitbreaker.*;

CircuitBreakerConfig config = CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.waitDurationInOpenState(Duration.ofMillis(1000))
.permittedNumberOfCallsInHalfOpenState(3)
.build();

CircuitBreaker circuitBreaker = CircuitBreakerRegistry.of(config).circuitBreaker("myCircuitBreaker");

Supplier<String> supplier = CircuitBreaker.decorateSupplier(circuitBreaker, () -> callRemoteService());

try {
String result = supplier.get();
System.out.println("Service response: " + result);
} catch (Exception e) {
System.out.println("Service call failed: " + e.getMessage());
}


Преимущества Circuit Breaker


Предотвращение каскадных сбоев: Circuit Breaker блокирует запросы к неисправному сервису, предотвращая распространение проблем.

Улучшение отзывчивости: При возникновении проблем прерыватель немедленно реагирует, позволяя системе быстрее восстанавливаться.

Снижение нагрузки: В разомкнутом состоянии прерыватель предотвращает лишние запросы к сервису, давая ему время восстановиться.

Улучшение пользовательского опыта: Вместо длительного ожидания пользователи получают немедленный ответ о недоступности сервиса.

Заключение


Circuit Breaker — это эффективный способ повышения надежности микросервисных систем. Он предотвращает каскадные сбои, улучшает отзывчивость и снижает нагрузку на критически важные сервисы. Использование таких инструментов, как Resilience4j, упрощает внедрение этого паттерна и делает его доступным даже для небольших проектов.
📌 Что такое MVVM?

💬 Спрашивают в 27 % собеседований

MVVM (Model-View-ViewModel) — это архитектурный шаблон, который разделяет приложение на три части: Model (данные и логика), View (интерфейс) и ViewModel (связь между Model и View).

🤔 Пример

Model
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}


ViewModel
public class UserViewModel : INotifyPropertyChanged
{
private ObservableCollection<User> _users;
public ObservableCollection<User> Users
{
get { return _users; }
set
{
_users = value;
OnPropertyChanged(nameof(Users));
}
}

public UserViewModel()
{
Users = new ObservableCollection<User>
{
new User { Name = "John Doe", Age = 30 },
new User { Name = "Jane Doe", Age = 25 }
};
}

public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}


View (XAML)
<Window x:Class="MVVMExample.MainWindow"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox ItemsSource="{Binding Users}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Age}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>


Код за View (Code-behind)
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new UserViewModel();
}
}


🤔 Краткий ответ

MVVM разделяет приложение на Model (данные), View (интерфейс) и ViewModel (связь). Это улучшает тестируемость и поддержку кода.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой ORM используется для работы с базами данных в Elixir?
Anonymous Quiz
31%
Ecto
20%
ActiveRecord
36%
Hibernate
13%
Sequelize
Применение WebSocket для создания интерактивных приложений

В современном веб-разработке интерактивные приложения играют ключевую роль в создании богатого пользовательского опыта. WebSocket — это технология, которая позволяет создавать приложения с мгновенной обратной связью, обеспечивая полнодуплексное соединение между клиентом и сервером. В этом посте мы рассмотрим, как использовать WebSocket для создания интерактивных пользовательских интерфейсов и улучшения взаимодействия в реальном времени.

Что такое WebSocket?


WebSocket — это протокол связи, который поддерживает постоянное соединение между клиентом и сервером. В отличие от HTTP, где сервер может ответить только на запрос клиента, WebSocket позволяет обеим сторонам обмениваться данными в режиме реального времени, без необходимости повторного установления соединения.

Почему WebSocket?


WebSocket идеально подходит для приложений, где важна мгновенная доставка данных и низкая задержка, например:

Чаты и мессенджеры: Мгновенная отправка и получение сообщений.
Онлайн игры: Синхронизация игровых данных между клиентами.
Торговые платформы: Обновление котировок и графиков в реальном времени.
Совместная работа: Синхронизация изменений в документах и проектах.

Как использовать WebSocket?


Установление соединения:

Соединение WebSocket начинается с HTTP-запроса, который затем "обновляется" до WebSocket протокола.

Пример на JavaScript:
const socket = new WebSocket('ws://example.com/socket');

socket.onopen = function(event) {
console.log('Connected to WebSocket server');
};

socket.onmessage = function(event) {
console.log('Message from server: ', event.data);
};

socket.onclose = function(event) {
console.log('Disconnected from WebSocket server');
};


Отправка и получение данных:

Как только соединение установлено, данные могут быть отправлены и получены в любое время.

Пример отправки данных:
socket.send('Hello, Server!');


Пример получения данных:
socket.onmessage = function(event) {
console.log('Received: ' + event.data);
};


Закрытие соединения:

Соединение WebSocket может быть закрыто как клиентом, так и сервером.

Пример закрытия соединения:
socket.close();


В следующем посте разберем Пример создания реального приложения 👇
Please open Telegram to view this post
VIEW IN TELEGRAM