Passwortgeschützte Internetseite ansteuern
-
www.animexx.de benutzt (glaub ich zumindest) eine PHP-Header funktion.
Hier mal ein beispiel:
<?php if($PHP_AUTH_USER!="usertest" OR $PHP_AUTH_PW!="pwtest") { Header('HTTP/1.1 401 Unauthorized'); Header('WWW-Authenticate: Basic realm="Top Secret"'); echo "Mit Abbrechen kommst Du hier nicht rein.\n"; exit; } echo "username / passwort richtig"; ?>
In php kannst du dann noch nach
echo "username / passwort richtig";
den benutzernamen / passwort über $PHP_AUTH_USER und $PHP_AUTH_PW bekommen.
kannst ja mal versuchen Dateiname.php?PHP_AUTH_USER=usertest&PHP_AUTH_PW=pwtest
die parameter direkt zu übergeben.mfg simon
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Gibt es nicht noch irgendeinen Weg, um das ganze unter C++ anzusteuern.
Es soll im Browser einfach die Internetseite nach erfolgreicher Passworteingabe erscheinen.Gebt mir bitte Anregungen, wenn ihr etwas parat habt!
Vielen Dank,
Euer Entertainer
-
Usernamen und Passwort sind base64 verscxhlüsselt.
base64(username:passwort)
Wenn du das ganze in einem POST als
Authorisation: Basic base64(username:passwort)
\n\nan den Server sendest bist du drin. Mehr macht der Browser auch nicht.
Wie du das aber mit dem IE machst KA.
-
Sorry, aber ich kenne mich da nicht so gut aus, könntest du mir vielleicht etwas Beispielscode zeigen???
Ich weiß nicht wie so etwas wie ein POST funktioniert.Vielen Dank,
Entertainer
-
Hmm.. also wird, wenn man mit PHP_AUTH_USER arbeitet der Username und das Passwort nicht im Header gesendet, sondern die PHP Parser gibt einen Zusätzlichen Header aus.. oder so in der art.. ?
Auf jedenfall funktioniert die sache mit PHP_AUTH_USER=usertest&PHP_AUTH_PW=pwtest bei ANimexx nicht... ^^"
Okay hab grad bei meinem Homeserver register_globals abgestellt.. jetzt geht das auch nichtmehr.. wird also bei Animexx daran dann liegen... Hmmm...Interresant...
Aber wie genau is das dann mit .htaccess geschützten Ordnern? Da kommt ja auch die PW Abfrage....
-
Was ich geschrieben habe wird im Header gesendet.
IMHO kann man das bezeichen wie man will. Man öffnet eine Socket und fängt an mit
POST /www.c-plusplus.net HTTP/1.0\nHost: www.c-plusplus.net\nContent-Type applikation/x-www-form-urlencoded\nContent-Length: 35\nAuthorisation: Basic base64(username:passwort)\n\nMEINEPOSTVAR=hallo&meinezweite=welt\n\n
Die NEWLINE sind zu beachten. Conetnt-Length ist die Zeichenlänge nach der Authorisierung. Hier 35 Zeichen beginned bei MEINEPOSTVAR
Das ganze sendet man nun über den Socket und erwarte die Antwort. So macht es jeder Brwoser.
-
ich verstehe es leider immer noch nicht. In diesem Thema bin ich noch recht neu. Könnte mir nicht vielleicht jemand etwas C++ Code als Beispiel bereitsstellen???
Ich komme echt nicht weiter. Bitte helft mir!!!
Vielen Dank,
Euer Entertainer
-
Du besorgst dir eine Klasse welche dir Socket-Funktinen zur verfügung stellt. Dann eine Socket zu einem Webserver öffnen und das oben angezeigte senden. Parameter und Website muss geändert werden.
-
Wozu sollte das gut sein? Er will doch offenbar nicht selbst den Inhalt der Seite abrufen sondern einen auf dem System installierten Browser dazu veranlassen, die Seite zu laden.
-
Ich habe nun versucht das alles in eine Funktion zu packen, aber es funktioniert nicht. Hier mein Source:
void __fastcall TForm1::WebServerAnsteuern(string strUrl, unsigned short usPort) { WSADATA wsa; if(::WSAStartup(0x101, &wsa )!= 0) // Sockets starten { WSACleanup(); _exit(0); } string strHost, strPfad; char caHostName[256], caFilePath[MAX_PATH]; strPfad.assign(strUrl.substr(strUrl.find("http://")+7)); strHost.assign(strPfad, 0, strPfad.find_first_of("/")); strPfad.assign(strPfad.substr(strPfad.find_first_of("/")+1)); struct hostent*(Host) = gethostbyname(strHost.c_str()); if(Host) { strcpy(caHostName, inet_ntoa(*((struct in_addr*)Host->h_addr_list[0]))); } else { strcpy(caHostName, strHost.c_str()); } SOCKADDR_IN addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(caHostName); addr.sin_port = htons(usPort); SOCKET Sock = socket(AF_INET, SOCK_STREAM, NULL); unsigned long NONEBLOCK = 1; if(Sock == SOCKET_ERROR || connect(Sock, (PSOCKADDR) &addr, sizeof(addr)) == SOCKET_ERROR || ioctlsocket(Sock, FIONBIO, &NONEBLOCK) != 0) { closesocket(Sock); WSACleanup(); } else { fd_set fds; struct timeval tv; tv.tv_sec = 20; tv.tv_usec = 0; char caUrl[256]; sprintf(caUrl, "%s%s%s%s%s", "GET /", strPfad.c_str(), " HTTP/1.0\r\nUser-Agent: Benutzer- Anmeldung 1.0\r\nHost: ", strHost.c_str(), "\nAuthorisation: Basic base64(Benutzer:Passwort)\n\n"); int iSel, Byte, err = 0, iTimeOut = 0; unsigned long ulSum = 0, ulSendLong = strlen(caUrl); do { FD_ZERO(&fds); FD_SET(Sock, &fds); iSel = select(Sock + 1, NULL, &fds, NULL, &tv); if(iSel && FD_ISSET(Sock, &fds)) { Byte = send(Sock, caUrl, ulSendLong, 0); if(Byte == SOCKET_ERROR) { err = GetLastError(); if(err == WSAEWOULDBLOCK) { if(iTimeOut++ < 1000) { Sleep(10); continue; } } closesocket(Sock); } else if(Byte > 0) { ulSum += Byte; if(ulSum >= ulSendLong){break;} } else { if(iTimeOut++ > 1000) { closesocket(Sock); WSACleanup(); } Sleep(10); } } else { if(iTimeOut++ > 1000) { closesocket(Sock); WSACleanup(); } Sleep(10); } } while(!err); } closesocket(Sock); WSACleanup(); Application->MessageBox("Anmeldevorgang beendet!", "Anmeldevorgang beendet", 0+64); }
Ich hoffe, ihr könnt mir nun helfen!!!
Vielen Dank,
Euer Entertainer
-
Jansen schrieb:
Wozu sollte das gut sein? Er will doch offenbar nicht selbst den Inhalt der Seite abrufen sondern einen auf dem System installierten Browser dazu veranlassen, die Seite zu laden.
Das kann schon sein aber ich kann ihm nur die Lösung bieten die ich habe. Wie man das im IE umsetztbzw. ob man ihn dazu bringen kann soweas zu machen weiß ich nicht und habe ich auch oben schon geschrieben. Den Ansatz wie es der Browser macht habe ich deshalb geschrieben weil es ja vielleicht möglich ist mit eine COM zu interagieren.
IMHO denke ich aber das er das ganze nicht für den IE braucvht sondern irgend eine Program schreiben will das diese Anmeldung kann.
-
Ohne zu testen ob diese Funktion richtig ist:
base64(Benutzer:Passwort)
ist eine Funktion die es nicht gibt.
Die musst du dir selbst schreiben oder eine vorhandene Klasse besorgen.
Ich wollte damit nur aufzeigen wie UID:PWD übergeben werden.
-
Vielleicht hilft diese Info weiter:
Die Anmeldung funktioniert mit Outlook Web Access, was wohl auf ASP deutet.
Vielleicht kennt hierfür jemand einen Weg für die Anmeldung.
Vielen Dank,
Euer Entertainer
-
Hallo Leute,
Ich habe mal wieder etwas Zeit gefunden und weiter nach einer Lösung meines Problems gesucht. Ich bin bei MSDN auf eine mögliche Antwort getroffen, die ich angepasst habe. Leider funktioniert es dennoch nicht. Vielleicht könnte sich jemand den Code mal ansehen:
HINTERNET hOpenHandle, hConnectHandle, hResourceHandle; DWORD dwError, dwStatus; DWORD dwStatusSize = sizeof(dwStatus); char strUsername[64], strPassword[64]; strUsername[64] = (char)"Benutzer"; strPassword[64] = (char)"Passwort"; hOpenHandle = InternetOpen("Anmeldung", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); hConnectHandle = InternetConnect(hOpenHandle, "https://Testserver.de/unterordner/", INTERNET_INVALID_PORT_NUMBER, NULL, NULL, INTERNET_SERVICE_HTTP,0,0); hResourceHandle = HttpOpenRequest(hConnectHandle, "GET", "/premium/default.htm", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0); resend: { HttpSendRequest(hResourceHandle, NULL, 0, NULL, 0); HttpQueryInfo(hResourceHandle, HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_STATUS_CODE, &dwStatus, &dwStatusSize, NULL); switch (dwStatus) { case HTTP_STATUS_PROXY_AUTH_REQ: // Proxy Authentication Required { // Insert code to set strUsername and strPassword. // cchUserLength is the length of strUsername and cchPasswordLength // is the length of strPassword. DWORD cchUserLength, cchPasswordLength; cchUserLength = sizeof(strUsername); cchPasswordLength = sizeof(strPassword); // Insert code to safely determine cchUserLength and cchPasswordLength. // Insert error handling code as appropriate. InternetSetOption(hResourceHandle, INTERNET_OPTION_PROXY_USERNAME, strUsername, cchUserLength+1); InternetSetOption(hResourceHandle, INTERNET_OPTION_PROXY_PASSWORD, strPassword, cchPasswordLength+1); goto resend; break; } case HTTP_STATUS_DENIED: // Server Authentication Required { // Insert code to set strUsername and strPassword. // cchUserLength is the length of strUsername and cchPasswordLength // is the length of strPassword. DWORD cchUserLength, cchPasswordLength; cchUserLength = sizeof(strUsername); cchPasswordLength = sizeof(strPassword); // Insert code to safely determine cchUserLength and cchPasswordLength. // Insert error handling code as appropriate. InternetSetOption(hResourceHandle, INTERNET_OPTION_USERNAME, strUsername, cchUserLength+1); InternetSetOption(hResourceHandle, INTERNET_OPTION_PASSWORD, strPassword, cchPasswordLength+1); goto resend; break; } } }
Die Quelle: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/handling_authentication.asp
Wie bereits gesagt arbeite ich mit dem C++ Builder mit dem ich auch alles kompilieren kann. Es handelt sich um einen Server mit ASP und https, bei dem ich die Anmedlung realisieren möchte.
Vielen Dank für eure Hilfe
-
Kann mir denn wirklich keine meine Fehler nennen oder wenigstens einen Hinweis geben???
Vielen Dank für euer Engagement,
Euer Entertainer
-
Was klappt an der msdn-lösung denn nicht ?
Gib uns mal nen paar Hinweise (http status-codes, fehlermeldung, ...)
-
Ganz einfach:
Nachdem ich die Anmeldung wie beschrieben durchgeführt habe und dann die Seite im Browser aufrufe, dann lande ich erneut bei der Anmeldung und nicht in dem geschützten Bereich.Vielleicht hilft euch das weiter.
Vielen Dank,
Euer Entertainer
-
Hmm, ich komme nur bis:
Run-Time Check Failure #2 - Stack around the variable 'strPassword' was corrupted.Allerdings nutze ich VC++.Net
-
Entertainer schrieb:
Ganz einfach:
Nachdem ich die Anmeldung wie beschrieben durchgeführt habe und dann die Seite im Browser aufrufe, dann lande ich erneut bei der Anmeldung und nicht in dem geschützten Bereich.Du willst deine Anwendung also nur zur Anmeldung benutzen und hinterher unabhängig von deiner Anwendung via Internet Explorer oder sonst einem Browser weitersurfen ?!