С++, IE и автоматическая авторизация BASIC Auth
Появилась задача: Написать программу на C++, которая бы запускала Internet Explorer, который бы, в свою очередь, авторизовался автоматически на сайте с защитой BASIC Auth. Посмотреть пример такой защиты можно даже у меня: зайти без логина и пароля в тестовый подраздел сайта не получится. Вы увидите что-то типа такого окошка:
Скрывать в этой директории мне особо нечего, логин: admin, пароль: 111. Однако нам надо не просто зайти, а с помощью программы, написанной на языке C++. Практически любая задача может быть разобрана на подзачи. Запускать внешние приложения с помощью C++ и Microsoft Visual Studio 2013 мы уже умеем - в этой статье разобрано. Теперь же задача усложняется, надо не просто запустить браузер, а заставить его еще автоматически заполнить поля ввода логина-пароля и нажать "Войти".
Здесь задача с одной стороны становится проще: подавляющее большинство современных браузеров логин и пароль в строке для Basic HTTP Auth передавать позволяют. Не будем сейчас говорить о том, что это противоречит современным стандартам, но это есть и это работает. Так, например, для оперы код захода на наш сайт выглядит так:
#include <stdio.h> #include <windows.h> int main(int argc, char *argv[]) { system("\"C:\\Program Files\\Opera\\launcher.exe\" https:\\admin:111@upread.ru/auth/index.php"); }Код пишется в Microsoft Visual Studio 2013, так что вступительные 2 строки необходимы. Приложение не консольное, самое обыкновенное. В первой части седьмой строки запускается опера (проверьте свой путь, она может быть у вас установлена в другом месте); во второй части идет связка логин-пароль через двоеточие, затем добавлен путь до сайта. Путь реально существующий, ведущий именно в раздел моего сайта. Если после запуска у вас открылась опера на этой странице и вы увидели надпись "Успешно", то все и есть успешно.
Но, как уже упоминалось, для IE это не прокатывает. Как же его заставить? Оказывается можно, надо просто создать и установить парочку значений реестра. Конкретно добавить поля с названиями iexplore.exe и explorer.exe; типом DWORD, а значение 0. Есть два варианта: для текущего пользователя и для всех. Различие только в ветках реестра. Для текущего пользователя:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
Для всех:
HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
Язык C++ может сделать и это, причем делается несложно, буквально парой срок. Для примера сделаем для текущего пользователя.
#include <stdio.h> #include <windows.h> #include <stdlib.h> typedef DWORD(WINAPI *REGSERVPROC)(DWORD, DWORD); DWORD value = 0; int main(int argc, char *argv[]) { HKEY hk; RegCreateKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE", &hk); RegSetValueEx(hk, L"explorer.exe", 0, REG_DWORD, (const BYTE*)&value, sizeof(value)); RegCloseKey(hk); HKEY hk2; RegCreateKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE", &hk2); RegSetValueEx(hk2, L"iexplore.exe", 0, REG_DWORD, (const BYTE*)&value, sizeof(value)); RegCloseKey(hk2); }Сложного здесь тоже ничего нет. 11 и 15 строки создают ключи реестра, 12 и 16 - устанавливают значения, 13 и 17 - закрывают. Предварительно добавляем пространства имен (3 строка) и инициализируем переменные в 4-5 строках. Теперь можно выложить и полный текст программы, которая запускает IE и буквально силой заставляет его авторизоваться на выбранном сайте.
#include <stdio.h> #include <windows.h> #include <stdlib.h> typedef DWORD(WINAPI *REGSERVPROC)(DWORD, DWORD); DWORD value = 0; int main(int argc, char *argv[]) { HKEY hk; RegCreateKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE", &hk); RegSetValueEx(hk, L"explorer.exe", 0, REG_DWORD, (const BYTE*)&value, sizeof(value)); RegCloseKey(hk); HKEY hk2; RegCreateKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE", &hk2); RegSetValueEx(hk2, L"iexplore.exe", 0, REG_DWORD, (const BYTE*)&value, sizeof(value)); RegCloseKey(hk2); system("\"C:\\Program Files\\Internet Explorer\\iexplore.exe\" https://admin:111@upread.ru/auth/index.php"); }Вот и все, цель достигнута. Если у вас есть какие-либо вопросы по написанию программ на языках C++, Java, PHP, JavaScript, заказы по созданию сайтов, то вы в любое время можете обратиться ко мне на почту up777up@yandex.ru. За очень умеренное денежное вознаграждение я вам с удовольствием помогу.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.