Как я предотвращаю атаки с повторением пакетов?

ensure_future vs create_task

ensure_future - метод создания Task из coroutine . Он создает задачи по-разному на основе аргумента (включая использование create_task для сопрограмм и объектов, подобных будущим).

create_task является абстрактным методом AbstractEventLoop. Различные циклы событий могут реализовать эту функцию по-разному.

Вы должны использовать ensure_future для создания задач. Вам понадобится create_task, только если вы собираетесь реализовать свой собственный тип цикла событий.

Обновление:

@ bj0 указал на Ответ Guido на эту тему:

Точка ensure_future() заключается в том, что у вас есть что-то, что может быть либо сопрограммой или Future (последняя включает в себя Task, потому что это подкласс Future), и вы хотите иметь возможность вызывать на нем метод, который определен только на Future (вероятно, единственным полезным примером является cancel()). Когда это уже Future (или Task), это ничего не делает; когда он является сопрограммой, он обертывает его в Task.

Если вы знаете, что у вас есть сопрограмма и вы хотите, чтобы она была запланирована, правильный API для использования create_task(). Единственный момент, когда вы должны называть ensure_future(), - это когда вы предоставляете API (например, большинство API-интерфейсов asyncio), который принимает либо сопрограммы, либо Future, и вам нужно что-то сделать, чтобы потребовалось Future.

blockquote>

и позже:

В конце я все еще верю, что ensure_future() является соответственно неясным именем редко требуемой части функциональность. При создании задачи из сопрограммы вы должны использовать имя с именем loop.create_task(). Может быть, для этого должен быть псевдоним asyncio.create_task()?

blockquote>

Удивительно для меня. Моей главной мотивацией использовать ensure_future все время было то, что это функция более высокого уровня по сравнению с членом цикла create_task (обсуждение содержит некоторые идеи, такие как добавление asyncio.spawn или asyncio.create_task).

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

Однако ответ Гвидо ясен: «При создании задачи из сопрограммы вы должны использовать назначенное имя loop.create_task() "

Когда сопрограммы должны быть завернуты в задачи?

Обертка сопрограммы в Задаче - это способ запуска этой сопрограммы" в фоновом режиме ". Вот пример:

import asyncio


async def msg(text):
    await asyncio.sleep(0.1)
    print(text)


async def long_operation():
    print('long_operation started')
    await asyncio.sleep(3)
    print('long_operation finished')


async def main():
    await msg('first')

    # Now you want to start long_operation, but you don't want to wait it finised:
    # long_operation should be started, but second msg should be printed immediately.
    # Create task to do so:
    task = asyncio.ensure_future(long_operation())

    await msg('second')

    # Now, when you want, you can await task finised:
    await task


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

Выход:

first
long_operation started
second
long_operation finished

Вы можете заменить asyncio.ensure_future(long_operation()) только на await long_operation(), чтобы почувствовать разницу.

16
задан Community 23 May 2017 в 11:53
поделиться

10 ответов

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

14
ответ дан 30 November 2019 в 15:41
поделиться

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

{Ts, U, HMAC ({Ts, U}, Ks)}

, Где Ts является меткой времени, U является именем пользователя, и Ks является секретным ключом сервера. Пользователь передает это обратно серверу, и сервер проверяет его путем перевычисления HMAC на предоставленных значениях. Если это допустимо, Вы знаете, когда это было выпущено и может принять решение проигнорировать его, если это является более старым, чем, скажем, 5 минут.

А хороший ресурс для этого типа разработки Do и Don'ts Аутентификации клиента в сети

13
ответ дан 30 November 2019 в 15:41
поделиться

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

4
ответ дан 30 November 2019 в 15:41
поделиться

В одном из моих приложений для остановки 'воспроизведения' нападает, я вставил информацию о IP в свой объект сессии. Каждый раз я получаю доступ к объекту сессии в коде, я удостоверяюсь, что передал Запрос. UserHostAddress с ним и затем я выдерживаю сравнение, чтобы удостовериться, что дюйм/с совпадает. Если они не делают, то, очевидно, кто-то другой, чем человек выполнил этот запрос, таким образом, я возвращаю пустой указатель. Это не лучшее решение, но это - по крайней мере еще один барьер для остановки атак с повторением пакетов.

2
ответ дан 30 November 2019 в 15:41
поделиться

Можно ли использовать память или базу данных для поддержания какой-либо информация о пользователе или запросе вообще?

Если так, затем по запросу на форму, я включал бы скрытое поле формы, содержание которого является случайным образом сгенерированным числом. Сохраните этот маркер к в контексте приложения или своего рода хранилище (база данных, плоский файл, и т.д.), когда запрос будет представлен. Когда форма отправлена, проверьте контекст приложения или базу данных, чтобы видеть, допустимо ли то случайным образом сгенерированное число все еще (однако, Вы определяете допустимый - возможно, это может истечь после X минут). Если так, удалите этот маркер из списка "позволенных маркеров".

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

1
ответ дан 30 November 2019 в 15:41
поделиться

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

1
ответ дан 30 November 2019 в 15:41
поделиться

(Атаки с повторением пакетов могут легко быть всеми о спуфинге IP/MAC, плюс Вам бросают вызов на динамическом дюйм/с)

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

ASP.Net ViewState является путаницей, избегайте его. В то время как PKI является тяжеловесом и чрезмерно увеличенный в размере, по крайней мере, он работает, не изобретая Вашу собственную безопасность 'схемы'. Таким образом, если бы я мог, я использовать его и всегда идти для взаимного authent. Аутентификация только для сервера довольно бесполезна.

1
ответ дан 30 November 2019 в 15:41
поделиться

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

0
ответ дан 30 November 2019 в 15:41
поделиться

Этот WebForms или MVC? Если это - MVC, Вы могли бы использовать маркер AntiForgery. Это кажется, что это подобно подходу, который Вы упоминаете кроме него, использует в основном GUID и устанавливает cookie со значением гуида для того сообщения. Для больше на этом см. блог Steve Sanderson: http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

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

0
ответ дан 30 November 2019 в 15:41
поделиться

ViewState включает в себя функциональность безопасности. См. Эта статья О некоторых функциях безопасности в области построения в ASP.NET. Он делает валидацию против сервера MeaderKey в Machine.config на сервере, что гарантирует, что каждая информация действительна.

Далее в статье Вы также видите, что если вы хотите хранить значения в собственных скрытых полях, вы можете использовать класс losformatter , чтобы кодировать значение таким же образом, что ViewState использует для шифрования.

private string EncodeText(string text) {
  StringWriter writer = new StringWriter();
  LosFormatter formatter = new LosFormatter();
  formatter.Serialize(writer, text);
  return writer.ToString();
}
1
ответ дан 30 November 2019 в 15:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: