bazaar

Интернет-магазин на собственном PHP-микрофреймворке - без Laravel и Symfony. Каталог, корзина в сессии, Stripe Checkout, аккаунты клиентов и полноценная админ-панель, на закаленных сессиях и исключительно prepared statements.

bazaar
TL;DR

Интернет-магазин на собственном PHP-микрофреймворке, без Laravel и Symfony. Каталог товаров, корзина в сессии, Stripe Checkout, аккаунты клиентов и полноценная административная часть. При платежах нет места для срезания углов, поэтому сессии закалены, а в базу идут исключительно подготовленные запросы.

Введение

Большие PHP-фреймворки делают за вас массу вещей, включая безопасность. bazaar намеренно от них отказывается: микрофреймворк, написанный с нуля, означает, что вы сами стережете сессии, сами строите запросы и сами отвечаете за то, чтобы данные клиента не утекли. Нет слоя, который тихо латает ваши недосмотры.

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

Осознанный спуск к голому PHP

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

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

От корзины к оплате

1
Каталог

товары с ценами, категориями и статусом публикации.

2
Корзина в сессии

позиции хранятся на стороне сервера, защищены от подмены в форме.

3
Stripe Checkout

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

4
Аккаунт и админка

история заказов для клиента, полная панель администратора для владельца.

Ключ в шагах два и три. Корзина живет на стороне сервера, поэтому цены и количества - это не то, что пришло из браузера, а то, что решил сам магазин. Оплата идет в Stripe, поэтому номер карты никогда не проходит через наш код, что убирает из системы самый опасный кусок ответственности.

Граница, которую вы стережете вручную

!
Внимание

Магазин принимает платежи, поэтому ошибки не косметические. В базу не попадает ни один запрос, склеенный из строк. Только подготовленные запросы, всегда, потому что это единственная граница, которая реально останавливает SQL-инъекцию.

repository.php · sql
SELECT id, name, price_cents
FROM products
WHERE slug = :slug AND published = 1
LIMIT 1;

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

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

Где граница и чем стережется

ГраницаЧем стережется
Ввод из формывалидация и экранирование
Запрос к базетолько подготовленные запросы
Корзинана стороне сервера, закаленная сессия
Данные картыотданы Stripe, никогда у нас

Больше проектов

Другие работы из той же категории - посмотрите, как мы решаем похожие задачи.

Есть похожий проект?

Напишите нам - смета бесплатна и приходит в течение часа.