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 для использования
blockquote>create_task()
. Единственный момент, когда вы должны называтьensure_future()
, - это когда вы предоставляете API (например, большинство API-интерфейсов asyncio), который принимает либо сопрограммы, либоFuture
, и вам нужно что-то сделать, чтобы потребовалосьFuture
.и позже:
В конце я все еще верю, что
blockquote>ensure_future()
является соответственно неясным именем редко требуемой части функциональность. При создании задачи из сопрограммы вы должны использовать имя с именемloop.create_task()
. Может быть, для этого должен быть псевдонимasyncio.create_task()
?Удивительно для меня. Моей главной мотивацией использовать
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()
, чтобы почувствовать разницу.
Если Вы хешируете в метке времени наряду с именем пользователя и паролем, можно закрыть окно для атак с повторением пакетов к в течение нескольких секунд. Я не знаю, удовлетворяет ли это Ваши потребности, но это - по крайней мере, частичное решение.
Если Вы действительно не хотите хранить какое-либо состояние, я думаю лучшее, которое можно сделать, ограничить атаки с повторением пакетов при помощи меток времени и короткое время истечения срока. Например, сервер отправляет:
{Ts, U, HMAC ({Ts, U}, Ks)}
, Где Ts является меткой времени, U является именем пользователя, и Ks является секретным ключом сервера. Пользователь передает это обратно серверу, и сервер проверяет его путем перевычисления HMAC на предоставленных значениях. Если это допустимо, Вы знаете, когда это было выпущено и может принять решение проигнорировать его, если это является более старым, чем, скажем, 5 минут.
А хороший ресурс для этого типа разработки Do и Don'ts Аутентификации клиента в сети
Вы могли использовать некоторую случайную строку проблемы, это используется наряду с именем пользователя для создания хеша. При хранении строки проблемы на сервере в базе данных, можно тогда удостовериться, что это только используется однажды, и только для одного конкретного пользователя.
В одном из моих приложений для остановки 'воспроизведения' нападает, я вставил информацию о IP в свой объект сессии. Каждый раз я получаю доступ к объекту сессии в коде, я удостоверяюсь, что передал Запрос. UserHostAddress с ним и затем я выдерживаю сравнение, чтобы удостовериться, что дюйм/с совпадает. Если они не делают, то, очевидно, кто-то другой, чем человек выполнил этот запрос, таким образом, я возвращаю пустой указатель. Это не лучшее решение, но это - по крайней мере еще один барьер для остановки атак с повторением пакетов.
Можно ли использовать память или базу данных для поддержания какой-либо информация о пользователе или запросе вообще?
Если так, затем по запросу на форму, я включал бы скрытое поле формы, содержание которого является случайным образом сгенерированным числом. Сохраните этот маркер к в контексте приложения или своего рода хранилище (база данных, плоский файл, и т.д.), когда запрос будет представлен. Когда форма отправлена, проверьте контекст приложения или базу данных, чтобы видеть, допустимо ли то случайным образом сгенерированное число все еще (однако, Вы определяете допустимый - возможно, это может истечь после X минут). Если так, удалите этот маркер из списка "позволенных маркеров".
Таким образом любые воспроизводимые запросы включали бы этот тот же маркер, который больше не считают допустимым на сервере.
Я плохо знаком с некоторыми аспектами веб-программирования, но я читал на этом на днях. Я полагаю, что необходимо использовать Данный случай .
(Атаки с повторением пакетов могут легко быть всеми о спуфинге IP/MAC, плюс Вам бросают вызов на динамическом дюйм/с)
, Это не просто воспроизведение, которое Вы, после здесь, в изоляции это бессмысленно. Просто используйте SSL и постарайтесь не изготовлять вручную что-либо..
ASP.Net ViewState является путаницей, избегайте его. В то время как PKI является тяжеловесом и чрезмерно увеличенный в размере, по крайней мере, он работает, не изобретая Вашу собственную безопасность 'схемы'. Таким образом, если бы я мог, я использовать его и всегда идти для взаимного authent. Аутентификация только для сервера довольно бесполезна.
Если Вы только принимаете каждый ключ однажды (скажите, сделайте ключ GUID, и затем проверьте, когда это возвращается), который предотвратил бы воспроизведения. Конечно, если взломщик отвечает первый , то у Вас есть новая проблема...
Этот 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/
Другая вещь, Вы рассмотрели проверку ссылающегося домена на обратной передаче? Это не является пуленепробиваемым, но это может помочь.
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();
}