Forum: PC-Programmierung CGI - Apache Auth


von Matthias (Gast)


Lesenswert?

Hallo zusammen.

Ich habe einen Apache-Server, dessen Seiten in der 'sites-enabled' 
mittels AuthType Basic kennwortgeschützt sind. Wird eine dieser Seiten 
aufgerufen, muessen BN und PW in eine MessageBox eingetragen, fertig.

Jetzt habe ich auf der Hauptseite das obligatorische 'Anmelden' und 'Neu 
Registrieren' ueber <form> ... in CGI-Skripten implementiert, die in C 
geschrieben sind.

Nach der Eingabe prueft der Server die CGI-Daten gegen eine 
mysql-Datenbank (innerhalb des CGI-Skripts) und meldet dann je nach 
Eingabe 'ist okay - Fehler'.

Soweit so gut. Mein Problem ist, dass ich jetzt an der Schnittstelle 
zwischen Apache AuthType Basic und den CGI-Sicherheitsdaten scheitere.
Ruft das CGI-Skript eine der geschuetzten Seiten auf -nachdem die Daten 
erfolgreich gecheckt, gespeichert, etc. wurden, geht die MessageBox des 
Apache auf und wir werden freundlich um die Eingabe gebeten.

Ich wuerde gerne implementieren, dass ich Apache Seiten zwar wie gehabt 
sperren kann, die Passoerter aber dann nach erfolgter Pruefung via CGI 
an den Server sende.

Und hier habe ich ein Brett vor dem Kopf.

Bin fuer jeden Hinweis dankbar.

von Peter II (Gast)


Lesenswert?

Matthias schrieb:
> Und hier habe ich ein Brett vor dem Kopf.

ich glaube das das geht nicht. Entweder eigene Anmeldung oder von 
Apache.

Sinnvoll ist die eigene Anmeldung aber nur über https, denn sonst kann 
man ja das Kennwort mitlesen.

von Mladen G. (mgira)


Lesenswert?

Im WWW-Authenticate header werden die HTTP Basic credentials gesetzt, 
das Passwort ist Base64 encoded (deswegen eben HTTPS einsetzen!), wenn 
dein CGI script diesen Header nutzt sollte es gehen.

von Matthias (Gast)


Lesenswert?

Danke für Eure Rückmeldungen. Das diese Kombination nicht machbar ist, 
habe ich mir schon gedacht.

HTTPS und base64-basierte Uebertragung war mir klar. Ich bin noch 
Programmieranfänger und der Sinn des ganzen sollte eher darin bestehen 
ein sinnvolles, praxisbezogenes Projekt unter Verwendung von C zu 
programmieren, dass verschiedene APIs einschliesst, gerade oder auch um 
die Zusammnhänge als solche besser zu verstehen.

Wegen dem Brett vor dem Kopf... Das ich mein CGI-Skript nicht mit der 
Apache-Authentifikation koppeln kann dachte ich mir. Aber jetzt habe ich 
eine Website, der Benutzer gibt seine BN-Daten ein, dass Skript prueft 
in einer MySQL-Datenbank auf (ja/nein)...

Auch wenn es blöd klingt, war mein nächster Gedanke nun aufgrund der 
fehlenden Anbindung an den Apache, dass ich innerhalb des CGI-Skripts
 einfach ein html-Dokument anlege, welches nur dann ausgegeben wird, 
wenn die Benutzerdaten korrekt waren.

Weil, würde ich das Dokument vorher anlegen und in meinem DocumentRoot 
ablegen, wüsste ich nicht, wie ich es sperren könnte und es erst mit 
meiner CGI-Variante freigeben könnte.

Das kommt mir aber irgendwie so vor, als würde ich mir die Hose mit der 
Kneifzange anziehen, weil einfach zu kompliziert und davon ab, wird mein 
html-Doc im CGI-Skript zur Laufzeit immer wieder neu prodzuziert.

von Mladen G. (Gast)


Lesenswert?

Diese Kombination ist machbar, lange CGI Script und Apache HTTP Basic 
Auth. nutzen ;)

von Matthias (Gast)


Lesenswert?

No comprende

von Matthias (Gast)


Lesenswert?

@Mladen

Wie gesagt...Programmieranfänger (mehr oder weniger)

Ich weiss wie TCP-Header aussehen und wie man sie implementieren kann.

Deinen Hinweis bezüglich des 'Authenticate header' verstehe ich nicht. 
Heisst das, ich kann/soll in meinem CGI-Skript einen eigenen/neuen 
Header implementieren?

Hat dieser überhaupt etwas mit 'normalen' Headern zu tun oder?

Für Details oder etwas mehr Infos wäre ich echt dankbar.

von Daniel A. (daniel-a)


Lesenswert?

Ich glaube eine Lösung gefunden zu haben:

Die open methode eines XMLHttpRequests
http://www.w3.org/TR/XMLHttpRequest/#the-open()-method

open(method, url, async, username, password)

Kann genutzt werden, um die logindaten mit basic auth zu senden und zu 
prüfen. Die login daten können im cgi-script aus dem auth header feld 
extrahiert werden. Das cgi script updatet eine von apache genutzte 
.htpasswd datei. Bei einer Seite die eine Authenthizierung erfordert 
konfiguriert man apache zum senden eines weiterleitungsheaders auf das 
login cgi script. Durch den referer header, der dadurch generiert wird, 
weiss das cgi script, zu welcher seite nach der Anmeldung gewechselt 
werden muss. Um nach überprüfen des Passworts auf die seite zu wechseln 
müssen die properties location.username, location.passwort, und 
location.href gesetzt werden. Dabei sollte sich der origin nicht ändern, 
damit sich browser die location.passwort nicht unterstützen an die 
logindaten des letzten xmlhttprequest errinnern können.

Also rein theorethisch.

von Matthias (Gast)


Lesenswert?

Langsam aber sicher fällt der Groschen. Jetzt weiss ich auch, wovon 
Mladen in seinem ersten Post geschrieben hat.

@Daniel

Vielen Dank für die Beschreibung.
Einiges war/ist mir nicht klar, deshalb habe ich gerade mal ein wenig 
geblättert...

Zum Verständnis, WWW-Authenticate könnte man bspw. über Apache SSI 
implementieren (ich weiss, SSI veraltet) ... Nur für mich erst mal 
wichtig, dass dies serverseitig zu implementieren ist, korrekt? 
Konfigurationssache.

Nachdem nun mein CGI-Skript an den Server meldet..."Ich hätte gerne 
Zugang" sendet dieser "401 - Not Authorized response code"

Nun, ich habe vorher vergessen zu schreiben, dass die Seiten nur in HTML 
verfasst sind.

Deine open()-Funktion stammt aber aus XML wie ich gesehen habe. Heisst 
das für mein Verständnis, dass ich die oben genannte 401 response in 
meinem CGI Skript auslese (u.a. die XML-Umgebungsvariablen) und dann 
über XML einen eigenen Antwort Header zurück sende?

von Mladen G. (mgira)


Lesenswert?

Matthias schrieb:
> Ich weiss wie TCP-Header aussehen und wie man sie implementieren kann.

Falsche Abstraktionsebene ;)

Matthias schrieb:
> Wie gesagt...Programmieranfänger (mehr oder weniger)

Gut, dann nochmal langsam.

Der HTTP Header WWW-Authenticate wird genutzt um die HTTP Basic 
Authentifizierung umzusetzen.
Ein HTTP Header (kein TCP Header) ist ein String im Header des HTTP 
Requests, dh. dieser String wird immer vom Client (Browser) zum Server 
(Apache) uebertragen, bei jedem HTTP Request, (auch) der Apache nutzt 
diesen um die HTTP Basic Implenetierung umzusetzen.

Hier mal eine Liste von moeglichen HTTP Headern: 
http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

Wenn dein CGI "Script" diesen Header auswerted anstat auf FOrm-based 
Authentification zu setzen, klappt das auch im ZUsammenspiel mit dem 
Apache HTTP Basic.

Matthias schrieb:
> Ich bin noch
> Programmieranfänger und der Sinn des ganzen sollte eher darin bestehen
> ein sinnvolles, praxisbezogenes Projekt unter Verwendung von C zu
> programmieren, dass verschiedene APIs einschliesst, gerade oder auch um
> die Zusammnhänge als solche besser zu verstehen.

Wuesste nicht das man sinnvolle Beispiele fuer C Programme als CGI im 
Netz findet, CGI wird meist mit anderen Sprachen, frueher Perl, 
heutzutage mit PHP implementiert.

C als low Level Sprache hat IMHO eher andere Einsatzbereiche, also wenn 
du C lernen willst dann eher nicht als CGI, und wenn du CGI lernen 
willst dann eher kein C.

Nebebnbei, der apache untersuetzt eine vielzahl von 
Authentifizierungsmethoden, aber HTTP Basic ist eine der einfachsten.

Nachtrag:
Der Apache koennte auch selbst in der DB nach dem usernamen und Passwort 
suchen um nach HTTP Basic zu authentifizieren, d.h. du koenntest 
grundsaetzlich immer den Apache die Authentifizierung machen lassen 
(HTTP Header setzen), dein Programm liest zusaetzlich den Usernamen und 
das Passwort aus (aus dem HTTP Header) wenn es das braucht.

Aber irgendwie ist das IMHO der falsche Weg um C oder CGI zu erlernen..

: Bearbeitet durch User
von Matthias (Gast)


Lesenswert?

Vielen Dank.

Ja die Sache mit den Begrifflichkeiten (HTML-Header/TCP-Header), mea 
culpa.

Ich muss mir das ganze in Ruhe ansehen und dann wird es was, nicht 
zuletzt aufgrund Eurer Tipps, Anregungen etc. Danke

Warum ich C benutze ist relativ simpel. Du kannst damit nahezu alles 
programmieren. Willst Du etwas auf OS-Ebene/Kernel-Ebene machen kannst 
Du das in C... Willst Du mit TCP/IP-Protokollen arbeiten geht das mit C 
und was noch wichtiger ist, Du lernst dabei enorm viel, was ich super 
finde.

Und man kann auch einen selbstgebastelten mysql-Client in ein CGI-Skript 
packen...:) was auch mit python und Co gegangen wäre.

Ich habe vorher nur im/am oder um das OS herum programmiert. Internet, 
Websites, HTML, war nicht meins. Bis vor kurzem doch noch mein Interesse 
geweckt wurde

Ersten Server aufgesetzt, erste Seiten eingerichtet und here we go.

Als ich gelesen habe, dass ich in CGI auch mit C arbeiten kann, mysql 
ansteuern kann etc, habe ich nur fälschlicherweise gedacht, dass es 
einfacher, nein eine konventionellere Möglichkeit gäbe, dem Apache die 
Daten zu übermitteln.

von Mladen G. (mgira)


Lesenswert?

Matthias schrieb:
> Warum ich C benutze ist relativ simpel. Du kannst damit nahezu alles
> programmieren. Willst Du etwas auf OS-Ebene/Kernel-Ebene machen kannst
> Du das in C... Willst Du mit TCP/IP-Protokollen arbeiten geht das mit C
> und was noch wichtiger ist, Du lernst dabei enorm viel, was ich super
> finde.

Schon klar, C ist unversell, aber nur Masochisten schreiben damit dyn. 
Webseiten m.E. ;)

Matthias schrieb:
> Und man kann auch einen selbstgebastelten mysql-Client in ein CGI-Skript
> packen...:)

Gibt es doch schon, warum das Rad eckig neu erfinden?

Matthias schrieb:
> Ich habe vorher nur im/am oder um das OS herum programmiert.

Dafuer ist C sehr gut geeignet, zumindest wenn die Aufgabenstellung "low 
level" genug ist.

Matthias schrieb:
> Internet,
> Websites, HTML, war nicht meins.

Dann ist C die falsche Sprache!
Jede Problemdomaene hat so seine eigenen etablierten Sprachen, im Netz 
sind PHP, Ruby, Java etc. pp. etabliert.

Matthias schrieb:
> Als ich gelesen habe, dass ich in CGI auch mit C arbeiten kann, mysql
> ansteuern kann etc, habe ich nur fälschlicherweise gedacht, dass es
> einfacher, nein eine konventionellere Möglichkeit gäbe, dem Apache die
> Daten zu übermitteln.

HTTP Header, Cookies etc. pp. gehoeren bei dyn. Webseiten nunmal dazu, 
aber wie gesagt, ist eher nicht die Domaene von C.

PHP koennte vielleicht etwas fuer dich dund dyn. Webseiten sein, das 
HTTP Protokoll, HTML, CSS und JavaScript gehoeren aber auch zu dyn. 
Webseiten.

Nebenbei, nicht einschuechtern lassen, da prasselt am Anfang viel auf 
einen ein (HTTP, HTML, CSS, JS, PHP, verschiedene Browser und deren 
Eigenheiten, etc. pp.), auch ganz ohne ein RDBMS wie MySQL, mit der Zeit 
bekommt ma den Ueberblick.

: Bearbeitet durch User
von Matthias (Gast)


Lesenswert?

>Wenn dein CGI "Script" diesen Header auswerted anstat auf FOrm-based
>Authentification zu setzen, klappt das auch im ZUsammenspiel mit dem
>Apache HTTP Basic.

Und wo gibt der User die Daten ein, in der MessageBox des Apaches? Weil 
ueber Formulardaten würde es dann ja nicht mehr gehen. Und wieso sollte 
ich dann noch HTTP-Header auswerten?


>Nachtrag:
>Der Apache koennte auch selbst in der DB nach dem usernamen und Passwort
>suchen um nach HTTP Basic zu authentifizieren, d.h. du koenntest
>grundsaetzlich immer den Apache die Authentifizierung machen lassen
>(HTTP Header setzen), dein Programm liest zusaetzlich den Usernamen und
>das Passwort aus (aus dem HTTP Header) wenn es das braucht.

Das hatte ich schon. Ueber das mysql Modul des Servers. Lief toll, nur 
halt versteckt hinter den Kulissen und das wollte ich selber machen um 
es zu verstehen.

von Mladen G. (mgira)


Lesenswert?

Matthias schrieb:
> Und wo gibt der User die Daten ein, in der MessageBox des Apaches?

Ja.

Matthias schrieb:
> Und wieso sollte
> ich dann noch HTTP-Header auswerten?

Falls das CGI "Ding" den Usernamen braucht, sei es nur zur 
Willkommenanzeige..

Matthias schrieb:
> Das hatte ich schon. Ueber das mysql Modul des Servers. Lief toll, nur
> halt versteckt hinter den Kulissen und das wollte ich selber machen um
> es zu verstehen.

Nun das Konzept solte ja klar sein, die Implementierung ist ja nicht so 
interessant behaupte ich mal.
Die Sourcen vom Apache und seinen Modulen kannst du dir ja ansehen weil 
es Open Source ist, und auch in C gerschrieben ;)

https://github.com/apache/httpd

Allerdingsm macht man das eigentlich nie wenn man dyn. Webseiten 
schreibt, man nutzt das Zeug und hat hoffentlich ein konzeptionelles 
Verstaednis.

von Matthias (Gast)


Lesenswert?

@ Mladen

Du hattes Recht. Ich bin an mehreren Stellen im Netz darauf gestoßen, 
dass Dein theoretischer Weg realisierbar sein soll.

Nun habe ich, bevor ich das Ganze in mein ohnehin überfülltes CGI-Skript 
schreibe, erst einmal einen kleinen TCP-Client gebastelt, der selbiges 
tun soll.

Siehe hierzu die Fkt. HTTPRequest. Egal wie ich den Header bearbeite, er 
will einfach nicht. Nach dem ersten Aufruf kommt logischerweise eine 
HTTP 401 zurück und nach der zweiten dann die HTTP 501 -Method not 
implemented-

Und ich habe nicht die blasseste Ahnung warum... Hier mal mein 
TcpClient.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <errno.h>      
4
#include <netinet/in.h>
5
#include <arpa/inet.h>
6
#include <netdb.h>       
7
8
//-------------------------------------------------------------------------
9
char *Namensaufloesung(const char *dns){
10
  char *ipString;
11
  struct hostent *hostData;
12
  struct in_addr **adressPointer;
13
  
14
  if(gethostbyname(dns) == NULL){perror("[GETHOSTBYNAME]"); exit(1);}
15
  hostData = gethostbyname(dns);
16
  adressPointer = (struct in_addr **)hostData->h_addr_list;
17
  ipString = inet_ntoa(**adressPointer);
18
  return ipString;
19
}
20
21
//-------------------------------------------------------------------------
22
int CreateSocket(char *ip, int portnummer){
23
  int sockfd, conValue;
24
  struct sockaddr_in adress;
25
 
26
  sockfd = socket(AF_INET, SOCK_STREAM, 0);  
27
  adress.sin_family = AF_INET;
28
  adress.sin_port = htons(portnummer);
29
  adress.sin_addr.s_addr = inet_addr(ip);
30
  conValue = connect(sockfd, (struct sockaddr *)&adress, sizeof(adress));
31
  printf("[CONVALUE %d]\n",conValue);
32
  if(conValue == 0)printf("Verbindung steht...\n");
33
  else perror("[CONNECT]");
34
  return sockfd;  
35
}
36
37
//-------------------------------------------------------------------------
38
void HttpRequest(int socketNummer){
39
  char befehl[] = "GET /secret/webpage_2.html HTTP/1.1\r\nHost: localhost\r\n\r\n";
40
  char befehl2[] = "GET /secret/webpage_2.html HTTP/1.1\r\nHost: localhost\r\nAuthorization: Basic 'mein base64 kodiertes BN:PW'\r\n\r\n";
41
  char empfangen[10000];
42
43
  write(socketNummer, befehl, sizeof(befehl));
44
  read(socketNummer, empfangen, sizeof(empfangen));
45
  printf("%s\n",empfangen);
46
  write(socketNummer, befehl2, sizeof(befehl2));
47
  read(socketNummer, empfangen, sizeof(empfangen));
48
  printf("%s\n",empfangen);
49
}
50
51
//-------------------------------------------------------------------------
52
int main(int argc, char *argv[]){
53
  char *ip;
54
  int socketNr, port;
55
  
56
  if(argc != 3){printf("[USAGE] ./client <DomainName> <Port>\n"); exit(1);}  
57
  ip = Namensaufloesung(argv[1]);
58
  port = atoi(argv[2]); 
59
  socketNr = CreateSocket(ip, port);
60
  HttpRequest(socketNr);
61
  return 0;
62
}

von Matthias (Gast)


Lesenswert?

Ergaenzend zu dem obigen Quelltext, hier mal die Ausgabe des Apache 
Error Logs, welche darauf hindeutet, dass es tatsaechlich am HTTP Header 
zu liegen scheint.

[Sat Jan 31 03:03:29 2015] [error] [client 127.0.0.1] malformed header 
from script. Bad header=<p>[fill_data_structs()] "stri: search_db.cgi, 
referer: http://localhost/webpage_main.html

von Peter P. (Gast)


Lesenswert?

Vielleicht hilft

http://de.wikipedia.org/wiki/HTTP-Authentifizierung

Hast du den Base64-Teil in (einfachen) Hochkommas?
Oder war das nur zur Illustration?
Sind bei Dir am Schluss eigentlich auch 2 mal "="?

Hast du mal Wireshark probiert?
Vielleicht mal verglichen mit einer funktionierenden Seite?

von Matthias (Gast)


Lesenswert?

> Hast du den Base64-Teil in (einfachen) Hochkommas?
Nein, dass war nur zur Demonstration. Der base64 kodierte Part steht so 
im Header, ohne Klammern.

> Sind bei Dir am Schluss eigentlich auch 2 mal "="?
Nur einmal.

> Hast du mal Wireshark probiert?
Das habe ich gemacht. Wireshark sieht gut aus. Allerdings gibt es einen 
kleinen Unterschied. Diese Ausgabe basiert darauf, dass ich nach Aufruf 
der 'geheimen' Seite meine Daten in eine Messagebox eingebe, AuthBasic 
innerhalb der Apache Konfig eben.

Bei meinem Programm werden die Benutzerdaten via HTML-Form und CGI 
verarbeitet und dann via HTTP-Header mit 'Authorization' uebermittelt.

So der Plan, bzw. so 'soll' es ja prinzipiell auch gehen, steht ja 
ueberall im Netz so. Einfach den Header ergaenzen, fertig.

Ich bekomme aber immer 501 'Method not implemented'. Also mir scheint es 
so, als wuerde das vom Apache kommen, aber wenn der das nicht kann, 
welcher Server dann?!

von Sven L. (sven_rvbg)


Lesenswert?

Wenn man sein Authentifikator nutzen will, dann setzt man Ihn i.d.R vor 
alle seine Scripte, so das er jedesmal aufgerufen wird, wenn eine Seite 
geladenn wird. Er Prüft dann ob es eine gültige Session gibt und lässt 
den Benutzer weiter oder erzeugt eine entsprechende Fehlermeldung!

Ansonsten kannst Du eventuell so deine Lösung an Apache ranflanschen, 
ist aber  sicher sehr aufwendig 
https://code.google.com/p/mod-auth-external/wiki/ConfigApache24

von Matthias (Gast)


Lesenswert?

@ Sven L.

Du beziehst Dich eingangs lediglich auf die Reihenfolge der 
Authentifizierung.

Wie sieht denn Deine Einschätzung bezogen auf meine bisherige 
Vorgehensweise aus?

Ich sende die Authentifizierung ja mittels meines HTTP-Headers direkt 
mit dem HTTP-Request, also er ja im Prinzip die Möglichkeit im Vorfeld 
auf einen gültigen User/Zugriff zu prüfen.

von Matthias (Gast)


Lesenswert?

@Sven L.

ES FUNKTIONIERT!!!!!!!!!!!!!!!!!!!!

Thema Reihenfolge. Ich habe einmal ueberprueft, was passieren wuerde, 
wenn ich statt meines Beispiels aus dem obigen Quellcode, Deinen Tipp 
bezueglich der Reihenfolge beachte und direkt den Auth-Header sende.

ERFOLG. Der einfache TcpClient gibt mir die "verborgene" Seite aus.

NEUES PROBLEM. Mache ich das gleiche in einem CGI Skript, bekomme ich im 
ErrorLog die Nachricht, das mein CGI Skript vorzeitig abgebrochen wurde.

Zwei Fragen hierzu...Kann ich in einem CGI Skript ueberhaupt einen 
TcpSocket aufbauen und zweites, was passiert, wenn ich ueber das 
CGI-Skript einen Socket aufbaue, via write() meinen HTTP-Header sende, 
wird die Ausgabe dann an den Socket oder den Browser geschickt?

Falls ersteres eintritt, wie bekomme ich letzteres dann hin?

von Sven L. (sven_rvbg)


Lesenswert?

Matthias schrieb:
> ES FUNKTIONIERT!!!!!!!!!!!!!!!!!!!!
Das ist doch schon mal Klasse

>
> Thema Reihenfolge. Ich habe einmal ueberprueft, was passieren wuerde,
> wenn ich statt meines Beispiels aus dem obigen Quellcode, Deinen Tipp
> bezueglich der Reihenfolge beachte und direkt den Auth-Header sende.
Irgendwie versteh ich nicht ganz wie Du das meinst...

Ich habe sowas halt mal in php gemacht, und in allen Scripten einfach 
meine login-Klasse mit require_once vorrangestellt. Die hat dann geprüft 
ob es eine Sitzung gibt oder niht.


>
> ERFOLG. Der einfache TcpClient gibt mir die "verborgene" Seite aus.
Ist das gut oder schlecht?

Man kann einen Apache so konfigurieren, das er kein Verzeichnislisting 
aus gibt, wenn man den Pfad zu einer Datei kennt bekommt man Sie meist 
trotzdem.

>
> NEUES PROBLEM. Mache ich das gleiche in einem CGI Skript, bekomme ich im
> ErrorLog die Nachricht, das mein CGI Skript vorzeitig abgebrochen wurde.
Vielleicht hilft es einen entsprechenden Exit-Code zu übergeben?
>
> Zwei Fragen hierzu...Kann ich in einem CGI Skript ueberhaupt einen
> TcpSocket aufbauen und zweites, was passiert, wenn ich ueber das
> CGI-Skript einen Socket aufbaue, via write() meinen HTTP-Header sende,
> wird die Ausgabe dann an den Socket oder den Browser geschickt?
Soweit ich mich an CGI erinnere, kannst Du damit so ziemlich alle 
Schweinereien machen, die Du dir vorstellen kannst, entsprechende Rechte 
vorausgestezt.

Nicht selten wurden Webserver über CGI gehackt.
>
> Falls ersteres eintritt, wie bekomme ich letzteres dann hin?
?

Aber nochmal, da ich denke wir haben uns etwas falsch verstanden, das 
was ich meinte ist eine Lösung im Script selber, HTTP-Auth-Header sind 
auf Webserverebene, kommen also vor allem Content.

Mein 1. Hinweis bezog sich auf eine Lösung im Script, mein 2. Hinweis 
meinte, das Du dem Apache sagst, das er zur Authentifizierung ein von 
dir geschriebenes CGI Aufrufen soll und damit was macht.

Also Form senden -> CGI Script -> das gibt True oder False Zurück.

Je nach Umgebung lässt man den Apache ja gerne mal gegen ein anderes 
System authentifizieren, eben dahin, wo man die Benutzer schon hat!

Das was Du vorhast, mit mysql, dafür gibt es übrigend auch ein fertiges 
Modul.

Ich weiß ja nicht in welchem Umfeld Du das ganze einsetzen willst, wenn 
es im Internet ist, nimm das fertige Modul wegen der Sicherheit!

von Matthias (Gast)


Lesenswert?

@ Sven L.

>Irgendwie versteh ich nicht ganz wie Du das meinst...

Stichwort Reihenfolge. Das obige Codebeispiel...Ich habe zwei Header 
nacheinander gesendet, erst den normalen ohne Auth und den zweiten, als 
Reaktion auf die 401 Server Meldung, dann mit Auth.

>Ist das gut oder schlecht?

Gut, wenn Du meine Eingangsposts liest habe ich das ja so realisiert, es 
scheiterte immer am Zugriff, aber dazu am Ende <dieses Posts> mehr, DENN 
ALLES LÄUFT JETZT PERFEKT

>Das was Du vorhast, mit mysql, dafür gibt es übrigend auch ein fertiges
Modul.

Nicht das was ich vorhabe, sondern was alles schon fertig gebaut 
war/ist, in C. Einzig und allein mit der Athentifizierung hat es 
gehapert.

Das war ja auch der Sinn des Ganzen. Nicht via Fertigmodule, sondern 
selbst gebaut in C, weil ich etwas Lernen wollte.

Ich habe jetzt das, was ich wollte und das sieht wie folgt aus UND 
LÄUFT.

Eine einfache HTML-Website zur Begrüßung. Ein <form>-Tag bei dem sich 
der User authentifizieren kann/muss. Wofür? Für die Website, welche ich 
eine Sperrung via AuthType Basic in der Apache Konfiguration angelegt 
habe. Diese gesperrte Seite und deren Verzeichnis sind für den User 
unsichtbar, werden im Listing nicht angezeigt.

Nachdem der User dem <form>-Tag seine Daten gegeben hat, werden diese 
innerhalb des CGI-Skripts extrahiert, geparst und in Strings kopiert. 
Diese Strings werden ueber die C-API mit einer mysql-Datenbank 
verglichen und bei einem Erfolg, baut sich ein TCP-Socket auf, der die 
"geheime" Seite durch Senden eines eigenen HTTP-Auth-Headers aufruft.

Davor werden die BN-Daten auch noch in einem selbstgebastelten 
base64-Converter kodiert, für die Übertragung. Alles in allem ist die 
Bezeichnung Skript etwas tiefgestapelt, aber es dürfte auch klar werden 
weshalb ich das Ganze so und nicht anders gemacht habe. Man lernt extrem 
viel.

Klar, ein Javaskript und etwas Magie hätten es auch getan, aber ohne 
Lerneffekt eben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.