С++, 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, си плюс плюс, BASIC Auth, Internet Explorer




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




Безопасность http-запросов от яндекс денег
Урок 23. Введение в области применения (scope) Laravel
Камин в саду