Как VS компилирует консольные приложения для показа, “Нажимают какую-либо клавишу для продолжения”?

Обновление:

Я добавил эту ссылку к своему другому ответу , как использовать аутентификацию JWT для ASP.NET Web API здесь для всех, кто интересуется JWT.


Нам удалось применить аутентификацию HMAC для защиты веб-API, и все заработало нормально. HMAC-аутентификация использует секретный ключ для каждого потребителя, который, как пользователь, так и сервер, знают, что hmac хэширует сообщение, следует использовать HMAC256. В большинстве случаев хешированный пароль потребителя используется в качестве секретного ключа.

Сообщение обычно строится из данных в запросе HTTP или даже из настроенных данных, которые добавляются в заголовок HTTP, сообщение может включать в себя:

  1. Метка времени: время отправки запроса (UTC или GMT)
  2. HTTP-глагол: GET, POST, PUT, DELETE.
  3. отправлять данные и строку запроса,
  4. URL

Под капотом аутентификация HMAC будет:

Потребитель отправляет HTTP-запрос на веб-сервер после того, как построение подписи (вывод хеша hmac), шаблон HTTP-запроса:

User-Agent: {agent}   
Host: {host}   
Timestamp: {timestamp}
Authentication: {username}:{signature}

Пример для запроса GET:

GET /webapi.hmac/api/values

User-Agent: Fiddler    
Host: localhost    
Timestamp: Thursday, August 02, 2012 3:30:32 PM 
Authentication: cuongle:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw=

Сообщение хешу для получения подписи:

GET\n
Thursday, August 02, 2012 3:30:32 PM\n
/webapi.hmac/api/values\n

Пример запроса POST со строкой запроса (подпись ниже неверна, просто пример)

POST /webapi.hmac/api/values?key2=value2

User-Agent: Fiddler    
Host: localhost    
Content-Type: application/x-www-form-urlencoded
Timestamp: Thursday, August 02, 2012 3:30:32 PM 
Authentication: cuongle:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw=

key1=value1&key3=value3

Сообщение в хеш для получения подписи

GET\n
Thursday, August 02, 2012 3:30:32 PM\n
/webapi.hmac/api/values\n
key1=value1&key2=value2&key3=value3

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

Когда на сервер поступает HTTP-запрос, для анализа запроса реализуется фильтр действий аутентификации: HTTP-глагол, временная метка, uri, данные формы и строка запроса, а затем на их основе создается подпись (используется хэш hmac) с секретным ключом (хешированным паролем) на сервере.

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

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

Код для создания подписи:

private static string ComputeHash(string hashedPassword, string message)
{
    var key = Encoding.UTF8.GetBytes(hashedPassword.ToUpper());
    string hashString;

    using (var hmac = new HMACSHA256(key))
    {
        var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
        hashString = Convert.ToBase64String(hash);
    }

    return hashString;
}

Итак, как предотвратить атаку воспроизведения?

Добавить ограничение для отметки времени, что-то вроде:

servertime - X minutes|seconds  <= timestamp <= servertime + X minutes|seconds 

(время сервера: время поступления запроса на сервер)

И, кешировать подпись запроса в памяти (используйте MemoryCache, следует ограничить время). Если следующий запрос приходит с той же подписью, что и предыдущий, он будет отклонен.

Демонстрационный код приведен здесь: https://github.com/cuongle/Hmac.WebApi

9
задан Moayad Mardini 29 September 2009 в 17:57
поделиться

6 ответов

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

Пакетный сценарий будет выглядеть примерно так:

echo off
YourApp.exe
pause
7
ответ дан 4 December 2019 в 05:57
поделиться

Это невозможно. Запрос на нажатие любой клавиши генерируется Visual Studio при запуске консольного приложения. Это не часть вашей программы.

Единственный способ - использовать Console.Read () в вашем коде

ОБНОВЛЕНИЕ : относительно вашего замечания об использовании TextPad: я не знаком с TextPad, но я бы не стал Не удивлюсь, если TextPad сделает то же самое, что и Visual Studio, при запуске консольного приложения.

14
ответ дан 4 December 2019 в 05:57
поделиться

You could do this...

static void Main(string[] args)
{
#if DEBUG
    Console.Read();
#endif
}

That way the program will not wait for the console input when you build your application as a 'Release'.

8
ответ дан 4 December 2019 в 05:57
поделиться

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

Для этого Visual Studio запускает cmd.exe, сообщая ему запустить ваш исполняемый файл, а затем делает паузу:

"C:\WINDOWS\system32\cmd.exe" /c ""...\ConsoleApplication1.exe"  & pause"

Вероятно, он этого не делает при отладке, так как получить идентификатор дочернего процесса для дочернего процесса немного сложнее.

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

22
ответ дан 4 December 2019 в 05:57
поделиться

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

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

1
ответ дан 4 December 2019 в 05:57
поделиться

Это поведение не имеет ничего общего с используемым вами компилятором. Когда вы компилируете с помощью Visual Studio, запуск исполняемого файла вне Visual Studio фактически будет работать так же, как при компиляции с помощью CSC в командной строке. Visual Studio (и TextPad) добавляет логику для добавления сообщения «Нажмите любую клавишу, чтобы продолжить» на консоли.

Если вы хотите, чтобы ваше приложение оставалось открытым, вам нужно будет сделать что-то вроде Console.ReadLine (), чтобы заблокировать выполнение, чтобы ваше приложение не завершило свое выполнение.

2
ответ дан 4 December 2019 в 05:57
поделиться