Forum: PC-Programmierung CGI-Parameter verschlüsseln


von peter (Gast)


Lesenswert?

Hallo Leute!


Ich habe einen Server zuhause stehen, an dem ein Gießroboter (per RS232) 
angeschlossen ist.
Außerdem läuft auf dem Server (Apache-Server) ein von mir geschriebenes 
CGI-Skript, welches bei einem bestimmten Übergabewert (z.b. 
http://meine-seite.de/giessen.cgi?=1) das Gießen der Pflanze-1 bei 
giessen.cgi?=2 das Gießen der Pflanze-2 usw. einleitet.
Sofern klappt das alles auch wunderbar, nur möchte ich das Übergeben 
dieser Parameter verschlüsseln.

Ich habe es bereits so gemacht, dass ich durch klicken eines Buttons auf 
einer HTML-Seite die jeweilige URL mit dem jeweiligen Wert ausführe.
-> Bei Klick auf Button-1: (http://meine-seite.de/giessen.cgi?=1  wird 
ausgeführt).
Das Problem ist nur, dass jeder, der auf dieser Seite landet, mit der 
rechten Maustaste -> Quellcode anzeigen; den Übergabeparameter sieht und 
meine Pflanzen gießen kann so oft er mag^^


Gibts da eine Lösung?

Vielen Dank

von Peter (Gast)


Lesenswert?

man könnte ja auch dem apache sagen das man sich anmelden muss z.b. über 
die thaccess.

von Sven P. (Gast)


Lesenswert?

Da bringt ne Verschlüsselung auch nichts... Setz mal lieber auf Passwort 
+ SSL, also z.B. modssl im Apache und dann HTACCESS-Dateien.

von peter (Gast)


Lesenswert?

ok, das wäre auch noch eine variante :)

das einzige Problem ist aber, dass User, die nur die Betriebsdaten 
angezeigt bekommen wollen (z.B. FÜllstand des Wasserkanisters, Erde: 
Feuchtigkeit usw) sich nicht anmelden brauchen.
Das heißt, dass Betriebsdaten von mir aus von ALLEN gesehen werden 
können. Ich will nur nicht, dass jemand die Pumpen ein/ausschaltet.

von Peter (Gast)


Lesenswert?

dann mach doch 2 CGI Dateien, eine mit anmeldung eine Ohne.

von Matthias (Gast)


Lesenswert?

Geht doch ganz einfach:

#Variante 1:

Einen Pseudozufallszahlengenerator in das CGI integrieren. Die aktuelle 
Zyklusnummer (Anzahl Takte), damit man den aktuellen Registerzustand 
berechnen kann.

Haken:
Du brauchst eine Blackbox, die dir den aktuellen Wert aus der 
Zyklusnummer berechnet.

#Variante 2:

Du generierst eine Zufallszahl mit ca. 8 Stellen. Bastelst Dir eine 
beliebige
Gleichung z.B. (Stelle1 + Stelle2) / (Stelle 3 - Stelle 4) ..... = X.
X wird zur Authentifizierung erwartet.

Vorteil: Ein taschenrechner (in jedem neuren Handy vorhanden) hat man 
meistens zur Hand. Probieren geht nicht, da jedes Mal eine neue 
Zufallszahl generiert wird.

von Sven P. (Gast)


Lesenswert?

Und eine dritte Variante ganz ohne Esoterik und Taschenrechner: Das 
CGI-Skript dazu bringen, ein Formular anzuzeigen, in welches man ein 
Passwort eingibt. Sicher ists dank SSL und wer was darf kannst du im 
Skript festlegen.

von Johnny (Gast)


Lesenswert?

Du brauchst ja nur eine zweite variable zu übergeben, welche als 
Passwort dient. Ist sie nicht vorhanden (Passwort leer), zeigst Du 
einfach den status an; ist das Passwort definiert und gültig, dann 
kannst Du auch die Buttons fürs Pumpen etc. anzeigen.

von peter (Gast)


Lesenswert?

Also...das sind ja schonmal wertvolle Tipps :) -> Danke erstmal!

Nun bin ich gerade leicht verwirrt. Ich benötige also erstmal ein vom 
Apache erzeugtes Anmeldefeld mit Benutzername und Passwort.

Hergang: Ich geh auf die Seite http://meineseite.de/giessen.cgi
-> Jetzt zeigt er mir die Werte an, da ich dem "giessen.cgi" keinen Wert 
übergeben habe. Auf der Seite steht jedoch ein Anmeldeforumlar, mit dem 
ich die Benutzerdaten dem CGI-Skript übergebe. Nachdem ich dann auf OK 
klicke sieht die URL wie folgt aus:

http://meineseite.de/giessen.cgi?=[benutzer]&Passwort=[passwort]

und schon habe ich das Problem, dass in der URL mein Benutzername und 
mein Passwort steht.


Sorry blicks grad nicht so ganz.

von Johnny (Gast)


Lesenswert?

Ja dann so:

Für die Anzeige (nur Anzeige implementiert + Link aufs geschützte cgi 
fürs Giessen):
http://meineseite.de/giessen.cgi?=...

Fürs giessen (Anzeige und Giessvorgang implementiert):
http://meineseite.de/protected/giessen.cgi?=...

Das protected Unterverzeichnis kannst Du mit htaccess schützen und dann 
hast nur Du darauf Zugriff.

von peter (Gast)


Lesenswert?

Edit:

Ahhh jetzt weiß ich wie ihr meint. ich brauch ja im Prinzip nur das vom 
im CGI-Skript erzeugte Anmeldeforumular IN CGI auswerten.
Das würde ja dann heißen, dass ich dem CGI-Skript einen Wert übergebe (= 
Inhalt der Texbox) und dort dann in einer Variable abspeichere.

if variable = true   -> zeige Button zum schalten der Pumpen.
if variable = 0      -> zeige nur die Ist-werte

meint ihr das so?

von Sven P. (Gast)


Lesenswert?

NEIN!!! Die Variable könnte ja wieder jeder Depp setzen.

Das mit dem Formular für ein Passwort war schon goldrichtig. Dass das 
Passwort dann auch übertragen wird, kannst du nicht verhindern. Wenn du 
allerdings das Formular mit method="POST" attributierst, landen die 
Eingaben schonmal nicht in der Adresszeile.
Im Klartext werden sie aber immer noch übertragen. Und das ist piepegal, 
wenn du das mit SSL anstellst :-)

PS: Auch bei HTACCESS werden Benutzer+Passwort im Klartext übertragen. 
Das ist vollkommen normal und üblich. Wers richtig sicher braucht -> 
SSL.

von peter (Gast)


Lesenswert?

aber mmooooment, die Variable im CGI-Skript kann doch nicht jeder Depp 
setzen, wenn ich sie z.B. in einer if-Anweisung abfrage?!

var = 188392276762   'das eigentliche Passwort
1
if (passwort == var)
2
{
3
   generiere_Buttons();
4
}
5
6
else
7
{
8
   mach_nix();
9
}

von Sven P. (Gast)


Lesenswert?

peter wrote:
> aber mmooooment, die Variable im CGI-Skript kann doch nicht jeder Depp
> setzen, wenn ich sie z.B. in einer if-Anweisung abfrage?!
Jo, und? Kennt doch sonst keiner das genaue Passwort...

Probier mal: (symbolischer Code...)
1
mein_passwort = "blablabla";
2
3
if (variable_vorhanden(passwort) && (passwort == mein_passwort)) {
4
  zeige_bedienfeld();
5
6
  if (variable_vorhanden(giessen)) {
7
    giesse_pflanze(giessen);
8
  }
9
}
10
11
zeige_status();

von peter (Gast)


Lesenswert?

Jaa genau das meinte ich ja, so hatte ich es ja vor, wie du geschrieben 
hast (dein Codebeispiel) :-)

Ich habe nur deshalb das geschrieben
>aber mmooooment, die Variable im CGI-Skript kann doch nicht jeder Depp
>setzen, wenn ich sie z.B. in einer if-Anweisung abfrage?!

weil du oben
>NEIN!!! Die Variable könnte ja wieder jeder Depp setzen.

geschrieben hast :)


Anscheinend haben wir aneinander vorbei geredet :)


Die Frage ist nur, wie kann ich im CGi-Skript den Inhalt einer Textbox 
(welche ja Javascript ist) einer Variablen der CGI-Programmiersprache 
(in meinem Falle C) übergeben.


Danke

von Sven P. (Gast)


Lesenswert?

peter wrote:
> weil du oben
>>NEIN!!! Die Variable könnte ja wieder jeder Depp setzen.
>
> geschrieben hast :)
> Anscheinend haben wir aneinander vorbei geredet :)
Das ist solange ok, wie du die Variable vernünftig prüfst. Eine Variable 
auf '1' setzen, das kann jeder Depp, aber das Passwort kennst ja nur du.

> Die Frage ist nur, wie kann ich im CGi-Skript den Inhalt einer Textbox
> (welche ja Javascript ist)
Ist er nicht, s.u.

> einer Variablen der CGI-Programmiersprache
> (in meinem Falle C) übergeben.
Ist dein CGI-Skript tatsächlich in C? Dann such nach 'CGIC'.

von peter (Gast)


Lesenswert?

Gut.
Jetzt muss ich aber trotzdem noch einiges wissen. Da ich meinen 
Linux-Server vorerst abschaffen möchte und dafür ein altes Windows 
XP-Laptop verwenden möchte, habe ich nun ein paar Fragen zur 
CGI-Programmierung in C.

Ich habe das Skript nicht in "CGIC" sondern in normalem "C" für CGI 
geschrieben. Da ich etch (auf dem Laptop) via PuttY ferngesteuert habe 
und somit alles in der Konsole gemacht habe, weiß ich leider keinen 
Befehl, mit dem man von Windows (Dev-C++ -> GCC) ein C-Programm in CGI 
wandeln kann. in Linux wars glaub ich so:

 > gcc -o /srv/cgi/programm.c /srv/cgi/programm.cgi

Wie mach ich das beim GCC unter Windows?

Als nächstes möchte ich mir einen Webserver auf diesem XP-Laptop 
einrichten. Ich habe mich dafür für XAMPP entschieden.

Mehr möchte ich zunächst nicht machen. Erstmal eine einfache Seite 
bauen, die dann auf dem "Webserver (XAMPP)" (XP-Laptop) läuft.

Vielen Dank!

von peter (Gast)


Lesenswert?

Ok, die Frage mit dem Compilieren in Windows mit der Konsole hat sich 
geklärt, funktioniert genauso wie unter Linux :-)


Nun muss ich nur noch wissen, wie ich mein XAMPP zu konfigurieren habe, 
damit dieser CGI kann.

Um zu sehen, wie ich mein CGI-Skript geschrieben habe, hier ein Beispiel 
unter folgendem Link:
http://openbook.galileocomputing.de/c_von_a_bis_z/c_026_008.htm#RxxobKap02600804002C761F0171E4


Danke!

von Sven P. (Gast)


Lesenswert?

peter wrote:
> Jetzt muss ich aber trotzdem noch einiges wissen. Da ich meinen
> Linux-Server vorerst abschaffen möchte und dafür ein altes Windows
> XP-Laptop verwenden möchte,
Schlechte Idee, meiner Meinung nach -- aber wie du möchtest.

> Ich habe das Skript nicht in "CGIC" sondern in normalem "C" für CGI
> geschrieben.
Es gibt kein 'normales C für CGI', CGIC ist nur eine C-Bibltiothek, die 
dir Argumente aus dem Datenrumpf (POST) oder der URL (GET) rauspopelt.

> Da ich etch (auf dem Laptop) via PuttY ferngesteuert habe
> und somit alles in der Konsole gemacht habe, weiß ich leider keinen
> Befehl, mit dem man von Windows (Dev-C++ -> GCC) ein C-Programm in CGI
> wandeln kann.
Ein CGI-Programm ist ein normales Programm, da gibt es nichts 
umzuwandeln.

> in Linux wars glaub ich so:
>
>  > gcc -o /srv/cgi/programm.c /srv/cgi/programm.cgi
Glaub ich nicht... eher vertauscht.

> Wie mach ich das beim GCC unter Windows?
Genauso.

> Als nächstes möchte ich mir einen Webserver auf diesem XP-Laptop
> einrichten. Ich habe mich dafür für XAMPP entschieden.
Wie schon eingangs gesagt -- wenn du mit Linux klarkommst, bleib dabei. 
Mit XP holst du dir dann nur wieder Stress ins Haus -- never change a 
running system.
Ansonsten ist XAMPP viel zu fett dazu, du brauchst weder Perl, noch 
Mysql noch PHP. Und eigentlich auch keinen dicken Apache, mit lighttpd 
wärst du sicher schneller fertig :-}

von peter (Gast)


Lesenswert?

Ok.

Dann kann ich mir mal den lighttpd anschauen :)

Noch eine Frage. Ich habe jetzt die compilierte cgi-Datei in den Ordner 
"C:\xampp\cgi-bin\test.cgi" kopiert.
Leider fordert er mich beim ausführen der URL auf, die Datei "test.cgi" 
herunterzuladen.
Warum bekomme ich nicht die Seite angezeigt/das Skript zum laufen??

Danke

von Sven P. (Gast)


Lesenswert?

Indem du dem Apache in seiner elend-langen Konfigurationsdatei 
verklickerst, er soll Dateien im /cgi-bin-Verzeichnis ausführen :-)

von peter (Gast)


Lesenswert?

und wie mach ich das?

habe schon in diversen Foren gesucht, aber nichts gefunden, was die 
httpd.conf beschreibt, um CGIs im Browser auszuführen

von Sven P. (Gast)


Lesenswert?

Die ganz offizielle Dokumentation des Apache haste noch nicht gefunden?

von peter (Gast)


Lesenswert?

meinst du jetzt die Docu oder die httpd.conf?

Ich möchte, dass mein CGI-Skript mich nicht zum speichern auffordert, 
sondern wie im Skript geschrieben steht, im Browser angezeigt wird :)

Das Problem ist nur, dass es das nicht macht. Unter Linux hatte ich 
damals glaube ich das gleiche Problem, ich habe es durch "chmod 777" 
gelöst. aber unter Windows???

von Sven P. (Gast)


Lesenswert?

Ich meine die Dokumentation. Der Apache ist außerordentlich gut 
dokumentiert, mit reichlich Anleitungen und Beispielen.

von peter (Gast)


Lesenswert?

ja ich weiß, trotzdem finde ich das aber nicht, wie ich es 
bewerkstellige.

Könntest du mir helfen?

von Sven P. (Gast)


Lesenswert?

Nein, kann ich nicht... hab Apache auch ewig nicht mehr gebraucht.
http://httpd.apache.org/docs/2.2/howto/cgi.html

von peter (Gast)


Lesenswert?

Sitze nun seit mehr als 2 Stunden hier und habe ALLE erdenklichen 
Möglichkeiten (von deinem Doku-Link bis hin zu Tipps aus diversen 
Internetforen) durchgespielt.

Es klappt einfach NICHT!

Hat denn keiner von den Linux-Gurus einen Tipp?!

von Sven P. (Gast)


Lesenswert?

- Richtige Pfade eintragen... keine Rückstriche dabei verwenden
- Content-type setzen
- Logdatei lesen

von peter (Gast)


Lesenswert?

>Richtige Pfade eintragen... keine Rückstriche dabei verwenden

Ist es denn bei Windows entscheidend ob es ein "Back-Slash" oder ein 
"Slash" ist, der z.B. "C:/xampp" bzw. "C:\xampp" voneinander trennt?

Content-Type im CGI-Skript setzen? Warum hat es dann vorher unter Linux 
funktioniert?

Danke!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

peter wrote:
>>Richtige Pfade eintragen... keine Rückstriche dabei verwenden
>
> Ist es denn bei Windows entscheidend ob es ein "Back-Slash" oder ein
> "Slash" ist, der z.B. "C:/xampp" bzw. "C:\xampp" voneinander trennt?
>
> Content-Type im CGI-Skript setzen? Warum hat es dann vorher unter Linux
> funktioniert?
>
> Danke!
Es kommt drauf an...

von Sven P. (Gast)


Lesenswert?

peter wrote:
> Ist es denn bei Windows entscheidend ob es ein "Back-Slash" oder ein
> "Slash" ist, der z.B. "C:/xampp" bzw. "C:\xampp" voneinander trennt?
Bei Linux ist es entscheident. Bei Windows bin ich mir nicht sicher -- 
eigentlich dient der Rückstrich als Escape-Zeichen (\n --> 
Zeilenumbruch).
Ich weiß auch nicht, was dann Vorrang hat, wenn man für sein 
Betriebssystem beknackterweise den Rückstrich auch noch als Pfadtrenner 
benutzt...

> Content-Type im CGI-Skript setzen? Warum hat es dann vorher unter Linux
> funktioniert?
Hat es?
WAS genau möchte denn immer runtergeladen werden -- die Programmdatei 
oder eine Datei, die deine erzeugte Ausgabe enthält? In letzterem Fall 
stimmt eindeutig der Content-type nicht.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Sven Pauli wrote:
> eigentlich dient der Rückstrich als Escape-Zeichen (\n
Eigentlich nicht... der Rückstrich sagt hier, dass das nachfolgende 
Zeichen als Steuerzeichen interpretiert werden soll.
In vielen Programmiersprachen wird es AUCH als Escape für 
Stringbegrenzer wie " vorgesehen. Dann kann man natürlich ein Einzelnes 
\ auch mit \\ darstellen.
> Ich weiß auch nicht, was dann Vorrang hat, wenn man für sein
> Betriebssystem beknackterweise den Rückstrich auch noch als Pfadtrenner
> benutzt...
Und das hat nix mit dem Betriebssystem zu tun und ist auch nicht 
beknackt, man könnte genausogut auch | als Pfadtrenner nehmen oder oder 
oder...

Die Umsetzung in Programmen/Programmiersprachen ist dann wieder was 
anderes, unter Java z.B. ist es egal ob man / oder \ nimmt unter 
Windows, da das intern korrekt umgesezt wird. Bei Linux gibt es da aber 
wohl manchmal Probleme.

Generell KÖNNTE man es ja mal probieren ob es daran liegt ich tippe aber 
auch eher auf ein anderes Problem, weil wenn etwas falsch konfiguriert 
ist gibts meist schlicht nen Fehler...

von peter (Gast)


Lesenswert?

Ok.

Wegen der Herunterzuladenden Datei:

Ich habe wiegesagt im Ordner "cgi-bin" eine vorher unter Linux 
einwandfrei funktionierende "test.cgi" liegen.
Wenn ich nun im Browser die Datei mit "C:\xampp\cgi-bin\test.cgi" 
AUSFÜHREN will (im Falle unter Linux wird dabei eine Einfache 
Hallo-Welt-Seite angezeigt), dann fragt er mich, ob ich die Datei 
test.cgi speichern möchte.
Richtig wäre eben, dass er mir ein "hallo welt" ausgibt.


Danke

von Sven P. (Gast)


Lesenswert?

Läubi Mail@laeubi.de wrote:
> Sven Pauli wrote:
>> eigentlich dient der Rückstrich als Escape-Zeichen (\n
> Eigentlich nicht... der Rückstrich sagt hier, dass das nachfolgende
> Zeichen als Steuerzeichen interpretiert werden soll.
Oder so.

> In vielen Programmiersprachen wird es AUCH als Escape für
> Stringbegrenzer wie " vorgesehen. Dann kann man natürlich ein Einzelnes
> \ auch mit \\ darstellen.
Kann nicht, sondern muss sogar, weil sonst das nachfolgende Zeichen 
wieder ausgehebelt würde...

>> Ich weiß auch nicht, was dann Vorrang hat, wenn man für sein
>> Betriebssystem beknackterweise den Rückstrich auch noch als Pfadtrenner
>> benutzt...
> Und das hat nix mit dem Betriebssystem zu tun und ist auch nicht
> beknackt, man könnte genausogut auch | als Pfadtrenner nehmen oder oder
> oder...
Ja sicher, aber wenn sowohl die Programmiersprache des Betriebssystemes 
(C, C++, C#, wie auch immer) den Rückstrich als Escape-Zeichen benutzen, 
dann ist die Wahl doch selten blöde, oder nicht?
1
char *pfad = "c:\\hier\\ist\\mein\\Verzeichnis";
Zumindest fand ich persönlich das immer verdammt lästig, also ich noch 
für Windows programmiert habe.

> Die Umsetzung in Programmen/Programmiersprachen ist dann wieder was
> anderes, unter Java z.B. ist es egal ob man / oder \ nimmt unter
> Windows, da das intern korrekt umgesezt wird. Bei Linux gibt es da aber
> wohl manchmal Probleme.
Regel: Pfadtrenner ist '/', alle anderen Zeichen (\0 wird gefiltert) 
sind im Dateinamen erlaubt. Punkt.

Ich würds sonst auch begrüßen, wenn der Fragende mal einen Schnippel 
seiner Logdatei anhängen würde :-)

von Sven P. (Gast)


Lesenswert?

peter wrote:
> Ich habe wiegesagt im Ordner "cgi-bin" eine vorher unter Linux
> einwandfrei funktionierende "test.cgi" liegen.
Blöde Frage aber: Hast du dein Programm auch unter Windows kompiliert 
oder einfach das von Linux rüberkopiert..?

> Wenn ich nun im Browser die Datei mit "C:\xampp\cgi-bin\test.cgi"
> AUSFÜHREN will (im Falle unter Linux wird dabei eine Einfache
> Hallo-Welt-Seite angezeigt), dann fragt er mich, ob ich die Datei
> test.cgi speichern möchte.
Dann speicher sie mal irgendwo ab und guck mit nem Editor rein -- steht 
da binäres Zeugs drinne oder etwa 'hallo welt'?

von peter (Gast)


Lesenswert?

Aaaalso es Klappt :) JUHUU :)

Danke erstmal bis dahin.
Ich kann jetzt mal den C-Code posten, der bei mir funktioniert. Ein 
Augenmerk ist dabei auf die Parameter zu richten, die nicht wie in html 
selbst mit einem davor- und dahintergestelltem  "" anfangen/enden:
z.B.  <input type="text">  in CGI sieht's so aus <input type=text>.

Jetzt habe ich aber bezüglich des CGI-Skripts selbst noch eine Frage.
Wie kann ich nun so ein Forumular erstellen, welches eine 
Passwortabfrage macht? In meinem bisher programmierten Fall soll es eine 
Abfrage sein, ob der Benutzer "1" oder "rest der Welt" anmeldet.
Wenn ich auf "OK" klicke, soll eine neue HTML seite geladen werden 
(später dann eben die Buttons für das EIN/Ausschalten von den Pumpen).
Könntet ihr mir helfen?



Hier mal der bis dahin funktionierende Code.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <fcntl.h>
4
#include <sys/types.h>
5
#include <sys/stat.h>
6
7
8
9
void print_html_header(void) 
10
{
11
   printf("Content-Type: text/html\n\n");
12
   printf("<html><head>\n");
13
   printf("<title>Test!!</title>\n");
14
   printf("</head><body bgcolor=#b3b3b3><pre>\n");
15
   printf("<script type=text/javascript></script>");
16
   printf("<form method=post action=>");
17
   
18
   
19
}
20
/* Das Ende eines HTML-Dokuments */
21
void print_html_end(void) 
22
{
23
   printf("</pre></body></html>\n");
24
}
25
/* Damit überhaupt ein HTML-Dokument ausgegeben wird */
26
27
28
void Ubergebe(void)
29
{
30
  printf("<tr><td>richtig</td></tr>");
31
}
32
33
34
int main(void) 
35
{
36
  char User=0;
37
38
   print_html_header();
39
   //p = getenv("HTTP_USER_AGENT");
40
   
41
   printf("<h4>Benutzer:</h4>"); 
42
   printf ("<input type=text size=6 name=User cols=10 rows=5/>");
43
   printf("<form target=_blank>");
44
   printf("<input type=image src =weiter_google.gif value=  OK!   target=_blank onclick=Ubergebe()>");
45
   if (User == 1)
46
   {  
47
      printf ("<tr><td>ok!</td></tr>");
48
   }
49
   else
50
   {
51
      printf ("<tr><td>Falsch!</td></tr>");
52
   } 
53
   print_html_end();
54
55
   return EXIT_SUCCESS;
56
}


Vielen Dank!

von peter (Gast)


Lesenswert?

Achso...Warum es nicht geklappt hat:
Ich hatte immer die Pfadangabe in den Browser geschrieben: 
C:\xampp\cgi-bin
Das war der Fehler!

Richtig wäre gewesen:

http://localhost/cgi-bin/test.cgi

von Sven P. (Gast)


Lesenswert?

peter wrote:
> Aaaalso es Klappt :) JUHUU :)
>
> Danke erstmal bis dahin.
> Ich kann jetzt mal den C-Code posten, der bei mir funktioniert.
Gut.

> Ein
> Augenmerk ist dabei auf die Parameter zu richten, die nicht wie in html
> selbst mit einem davor- und dahintergestelltem  "" anfangen/enden:
Hat das einen konkreten Sinn? Weder C, noch CGI noch sonstwer fordern 
sowas.

> z.B.  <input type="text">  in CGI sieht's so aus <input type=text>.
Ist syntaktisch absolut schlampig... da gehören Anführungszeichen drum.

> Jetzt habe ich aber bezüglich des CGI-Skripts selbst noch eine Frage.
> Wie kann ich nun so ein Forumular erstellen, welches eine
> Passwortabfrage macht?
Indem du dir CGIC besorgst und die übertragenen Formulardaten 
auswertest.

von peter (Gast)


Lesenswert?

ok.

Sobald ich aber die Anführungszeichen weglasse, motzt mein GCC!

von Sven P. (Gast)


Lesenswert?

peter wrote:
> ok.
>
> Sobald ich aber die Anführungszeichen weglasse, motzt mein GCC!

"Hä"? Du lässt sie doch momentan weg!

von peter (Gast)


Lesenswert?

Sorry ich meinte natürlich, wenn ich sie DRANLASSE, motzt mein Compiler.

-> Syntax error in main-function

von Sven P. (Gast)


Lesenswert?

Tjo...
Ich verweise mal auf
Beitrag "Re: CGI-Parameter verschlüsseln"
Da steht was über Escape-Zeichen drinne :-)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Da haben aber haku und ich doch gerade lang und breit drüber geschwätzt 
;)
1
printf ("<input type=text size=6 name=User cols=10 rows=5/>");

muß dann werden:
1
printf ("<input type=\"text\" size=\"6\" name=\"User\" cols=\"10\" rows=\"5\"/>");

Es ist natürlich "selten dämlich" das HTML gerade als Einklammerung für 
seine Attribut Werte das gleiche Zeichen nutzt das C für die Begrenzung 
von Strings vorsieht :P ;)

von Simon K. (simon) Benutzerseite


Lesenswert?

Läubi Mail@laeubi.de wrote:
> Es ist natürlich "selten dämlich" das HTML gerade als Einklammerung für
> seine Attribut Werte das gleiche Zeichen nutzt das C für die Begrenzung
> von Strings vorsieht :P ;)

Nimm doch das Apostroph '. Das geht genau so gut in HTML.

Übrigens: Windows ist es (seit längerem) egal ob du einen / oder einen \ 
als Trennzeichen auf der Konsole benutzt. Beides völlig gleichwertig.

von peter (Gast)


Lesenswert?

Ok, ich werds dann morgen versuchen :)

Danke erstmal!

von Sven P. (Gast)


Lesenswert?

Simon K. wrote:
> Übrigens: Windows ist es (seit längerem) egal ob du einen / oder einen \
> als Trennzeichen auf der Konsole benutzt. Beides völlig gleichwertig.
Und warum darf man >, <, | usw. nicht im Dateinamen benutzen? Richtig: 
weil der Rückstrich als vermutlich gebräuchlichstes Escape-Zeichen schon 
verbaut ist :-)

Und: Selbst wenn es Windows egal ist: Apache kommt aus der Unix-Welt, da 
ist es nicht egal, mitunter ist der Rückstrich in dessen 
Konfigurationsdateien tatsächlich als reines Escape-Zeichen gedacht.

von Simon K. (simon) Benutzerseite


Lesenswert?

Sven Pauli wrote:
> Simon K. wrote:
>> Übrigens: Windows ist es (seit längerem) egal ob du einen / oder einen \
>> als Trennzeichen auf der Konsole benutzt. Beides völlig gleichwertig.
> Und warum darf man >, <, | usw. nicht im Dateinamen benutzen? Richtig:
> weil der Rückstrich als vermutlich gebräuchlichstes Escape-Zeichen schon
> verbaut ist :-)
>
> Und: Selbst wenn es Windows egal ist: Apache kommt aus der Unix-Welt, da
> ist es nicht egal, mitunter ist der Rückstrich in dessen
> Konfigurationsdateien tatsächlich als reines Escape-Zeichen gedacht.

Ich wollte ja auch viel eher sagen, dass man egal ob Windows oder Linux, 
immer einen Slash ("/") benutzen kann und aus den von dir genannten 
Gründen auch tun sollte :-)

von peter (Gast)


Lesenswert?

Hey Leute!

Also jetzt habe ich mal eine Frage wie das nun im Skript selbst 
aussieht.

Wie sieht es nun mit meinem oben geposteten CGI-Skript aus?
Der Code ist eine Anmeldemaske mit einer Textbox. Sobald in dieser 
Textbox eine "1" steht und auf den Button "ok" geklickt wird (dieses 
"google.gif" tut überhaupt nix zur Sache), soll abgefragt werden ob das 
Passwort richtig ist.
Ist es richtig, so soll eine Seite geladen werden, die z.B. "Richtig" 
anzeigt. Diese "richtig-Seite" soll später dann mal die Möglichkeit mit 
den Buttons aufzeigen, sprich nur Leuten, die das Passwort richtig 
eingegeben haben, Zugriff gewähren :)

Ist der "Benutzer" falsch, soll eine neue Seite (HTML-Seite, keine 
message-Box!) mit "Falsch" ausgegeben werden.

Wie kann ich da eine neue Seite laden, bzw. die HTML-Seite 
aktualisieren?



Vielen Dank!

von Peter (Gast)


Lesenswert?

Schau dich doch am besten erstmal auf php.net um, dort sind viele kleine 
Beispiele wie man etwas mit Formularen macht.

Kurzfassung:
 Beim Submit werden die Parameter an das script aus "action" übergeben 
(etweder in der URL oder als Header). Das Script werdet dann die 
Parameter aus und liefert als Antwort eine neue webseite aus.

von peter (Gast)


Lesenswert?

Ne Frage: Was hat PHP damit zutun?
Ich programmiere ja im Grunde in C -> HTML und JavaScript, so dachte ich 
es zumindest.
Denn in Javascript habe ich ja in meinem Skript eine Textbox erstellt. 
Sobald ich auf "OK"  klicke, soll ja die Textbox ausgewertet werden.
Es wird die Funktion "Ubergebe()" aufgerufen und DANN eine Seite geladen 
werden.

Warum mit PHP?


Danke!

von Peter (Gast)


Lesenswert?

Weil du damit erstmal die Grunlagen verstehts, mit php sind es 3Zeilen 
und es geht - man kann testen was wie geht. Wenn man das dann einmal 
verstanden hat kann man auf CGI umstellen.

von Peter (Gast)


Lesenswert?

nachtrag:
> onclick=Ubergebe()
Ich hoffe du glaubst nicht das mit dem html code wirklich deine C 
funktion
void Ubergebe(void)
aufgerufen wird, oder etwas doch?

von peter (Gast)


Lesenswert?

Hallo...
Nun habe ich mal etwas rumprobiert und die erste Seite klappt schon mal.
Das Problem ist aber die zweite Seite.
Als Versuch habe ich zunächst einmal einfach eine Eingabe mit einem 
"Namen"-Feld und deinem "Text"-Feld und einem Button "Abschicken".

Der C-Code lautet wie folgt (er funktionierrt auch einwandfrei):
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <fcntl.h>
4
#include <sys/types.h>
5
#include <sys/stat.h>
6
7
void print_html_header(void) 
8
{
9
   printf("Content-Type: text/html\n\n");
10
   printf("<html><head>\n");
11
   printf("<title>Test!!</title>\n");
12
   printf("</head><body bgcolor=#b3b3b3><pre>\n");
13
   printf("<form method=\"post\" action=\"pruefe.cgi\">");
14
   
15
   
16
}
17
/* Das Ende eines HTML-Dokuments */
18
void print_html_end(void) 
19
{
20
   printf("</form></body></html>\n");
21
}
22
/* Damit überhaupt ein HTML-Dokument ausgegeben wird */
23
24
25
26
int main(void) 
27
{
28
  char User=0;
29
30
   print_html_header();
31
   
32
   printf("Ihr Name: <input type=\"text\" name=\"name\"><br>"); 
33
   printf("Ihre Nachricht: <textarea name=\"nachricht\"></textarea><br>");
34
   printf("<input type=\"submit\" name=\"Button\" value=\"Abschicken\">");
35
   
36
   print_html_end();
37
38
   return EXIT_SUCCESS;
39
}
Nun zum Problem:

Sobald ich auf den Button klicke, sollte eigentlich ein Formular mit 
"ihr name war: ..." angezeigt werden. Eben mit dem Namen, der vorher in 
die Texbox eingegeben wurde. -Das macht es aber nicht!
Ich habe vorerst das Ganze in einer normalen test.php auf meinem 
XAMPP-Server probiert, da lief das Skript einwandfrei. Anschließend habe 
ich es in CGI eingebunden, hier der Code dafür.:
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <fcntl.h>
4
#include <sys/types.h>
5
#include <sys/stat.h>
6
7
8
9
void print_html_header(void) 
10
{
11
   printf("Content-Type: text/html\n\n");
12
   printf("<html><head>\n");
13
   printf("<title>Test!!</title>\n");
14
   printf("</head><body bgcolor=#b3b3b3><pre>\n");
15
   
16
}
17
/* Das Ende eines HTML-Dokuments */
18
void print_html_end(void) 
19
{
20
   printf("</body></html>\n");
21
}
22
/* Damit überhaupt ein HTML-Dokument ausgegeben wird */
23
24
25
26
int main(void) 
27
{
28
   print_html_header();
29
   printf("<?php echo "Ihr Name: $_POST[name] ?>"); 
30
   print_html_end();
31
32
   return EXIT_SUCCESS;
33
}

Das Problem ist aber, dass er nix anzeigt. Komischerweise, wenn ich mit 
der rechten Maustaste auf "Quelltext anzeigen" gehe und dann diesen Code 
in eine "test.php" einfüge, klappt das Skript einwandfrei und zeigt mir 
an "Ihr Name: ".
Warum nicht im CGI-C-Skript?? Kompilieren tut er einwandfrei.
Probier schon seit ner Stunde rum, komm einfach nicht drauf!


Danke

von peter (Gast)


Lesenswert?

sorry habe bei meinem Post die Backslash beim printf(echo....) 
vergessen. -Ist nicht der Grund, warum es nicht funktioniert!

von Sven P. (Gast)


Lesenswert?

Du schnallst das nicht wirklich, wie das mit CGI funktioniert, oder?!
Dein letzter C-Schnippsel lässt sich übrigens unter Garantie nicht 
compilieren.

Zur Erinnerung: Common GATEWAY Interface.

Nachtrag: OK, ersten Fehler bemerkt.
Warum kopierst du die Quelltexte nicht einfach, anstatt sie andauernd 
abzutippen...?

von peter (Gast)


Lesenswert?

>Nachtrag: OK, ersten Fehler bemerkt.
>Warum kopierst du die Quelltexte nicht einfach, anstatt sie andauernd
>abzutippen...?

Hö?? Was meinst du damit?


der letzte Codeschnippsel lässt sich sehr wohl kompilieren, wiegesagt 
das Backslash gehört natürlich überall dahin, wo innerhalb der 
"printf-Funktion" ein -> " <- (Gänsefüßchen) steht.

Wenn ichs schnallen würde, würde es funktionieren ;)

von Peter (Gast)


Lesenswert?

Was soll soetwas in einen C Programm
("<?php echo "Ihr Name: $_POST[name] ?>");

entweder du machst PHP oder C(CGI) dann musst du dir etwas einfallen 
lassen die du an die Variable $_POST[name] rankommst - das nimmt dir PHP 
sonst ab.

von peter (Gast)


Lesenswert?

kennst du denn eine Funktion, die den Wert einer Variablen holt??

von Sven P. (Gast)


Lesenswert?

Himmel Arsch und Zwirn: C-G-I-C, zum hundersten Mal.

von Peter (Gast)


Lesenswert?

>die den Wert einer Variablen holt??
Das Problem ist das es die Variable nicht gibt, woher soll sie auch 
kommen.

Es gibt verschienden Möglichkeiten, etweder musst du die URL 
(xyz.cgi?test=abc) selber auseinander nehmen oder du nimmst eine fertige 
CGI lib. Aber ich würde sagen du machst es lieber mit PHP und startest 
aus dem PHP dein Programm - damit wird du schneller zum ziel kommen.

von peter (Gast)


Lesenswert?

Bei "CGI-C" verstehe ich nicht, wie ich die header-dateien einbinde, 
kompiliere usw.


Ich glaub ich lass es einfach....

von Peter (Gast)


Lesenswert?

Dann mach es dir einfach, schreibe es in PHP und wenn du alles soweit 
geprüft hast (Passwort OK) dann startest du dein Programm aus dem PHP

System("programm[.exe]");

von peter (Gast)


Lesenswert?

Mir is das hier alles zu konfus. Der eine sagt das, der andere 
das...Wenns mal eine Schritt-für-Schritt-Anleitung für IRGENDWAS gäbe, 
dann wäre das alles einfacher. Aber nur irgendwelche eingeworfenen 
Vorschläge, damit kann ich nix anfangen.-Sorry.

Ich wollte es in CGI und zwar in C CGI schreiben, einfach nur ein 
Formular mit einer Passwortabfrage.
Aber anscheinend sprengt es den Rahmen.

von Peter (Gast)


Lesenswert?

Sorry das du es nicht verstehst, aber wer es als C-Programmierer nicht 
hinbekommt eine Lib einzubinden für den ist ein CGI programm der falsche 
Einstieg. An deinen Versuchen sieht man das du nicht einmal genau weiss 
an welcher Stelle was ausgeführt wird ( Browser oder Server).

Also Fang erstmal mit den Grundlagen an! Oder mache es mit PHP und sein 
estmal froh das es geht.

von peter (Gast)


Lesenswert?

@Peter: Zum Prüfen kommts ja erst garnicht, anscheinend kann man ja nich 
den Inhalt von dem Textfeld abfragen. Wiegesagt, binde ich cgic ein, 
dann klappts nicht. vielleicht mache ich auch einen Fehler...

von peter (Gast)


Lesenswert?

Ich verwende Dev-CPP.
Ich binde die Dateien (alle aus dem Ordner CGIC) über Rechtsklick auf 
das Projekt -> Zum Projekt hinzufügen ein.
Ich kompiliere -> Fehler: Build Error [test.exe] Fehler 1.

von Peter (Gast)


Lesenswert?

Ich kenne leider Dev-CPP nicht. Aber wenn man mit C anfängt sollte man 
auf die Kommandozeile gehen und das erste "Hallo World" Programm von 
Hand übersetzen (Compiler -> Linker ).
Wenn man dann estmal verstanden hat wie die schritte sind kann sich auch 
mit der IDE Arbeiten.

Ich glaube auch nicht das das der komplette Fehler ist

Fehler: Build Error [test.exe] Fehler 1.

da steht doch bestimmt mehr da, denn mit der Zeile kann man nichts 
anfangen.

von peter (Gast)


Lesenswert?

Also kompilieren tut er nun.

Gibt es für das CGIC eine ordentliche Dokumentation / Anleitung?

von Peter (Gast)


Lesenswert?

weiss ja nicht was du unter ordentlich Verstehts aber
hier http://www.boutell.com/cgic/#howto steht alles wichtige da.

von peter (Gast)


Lesenswert?

Also ich werds jetzt so machen.
Ich schreibe mir eine "intro.cgi", die zur Anzeige (nur zur Anzeige!) 
der Messwerte dient. Die Werte bekommt sie über eine von dem 
Kommunikationsprogramm (welches ebenfalls auf dem Server läuft und die 
Sensorik am AVR über ser. Schnittstelle überprüft) erstellten dat-Datei. 
Dort liegen alle Infos über die am AVR angeschlossenen Sensoren.
Beim Ausführen des intro.cgi werden diese Werte aus der dat-Datei 
(fread()) eingelesen und daraus eine HTML-Seite erzeugt.

Neben der Anzeige der Messwerte befindet sich ein Button "Schalte 
Verbraucher". Sobald auf diesen Button geklickt wird, soll via .htaccess 
eine Passwortabfrage erfolgen. Wenn die Abfrage erfolgreich verlaufen 
ist, kommt der User auf eine weitere cgi-Seite, die mehrere Buttons hat. 
(Pumpe-1, Pumpe-2, Pumpe-3 usw).
Wenn nun auf einen dieser Button geklickt wird, wird eine CGI mit dem 
jeweiligen Parameter aufgerufen.
Beispiel: http://meineseite.de/cgi-bin/schalte.cgi?=1  (wäre das 
schalten von Pumpe-1) cgi?=2 (wäre schalten von Pumpe-2) usw.
Die jeweilige CGI setzt dabei dann ein Flag in eine Auftrag.dat. Sobald 
dort ein Flag gesetzt ist, holt sich durch sekündliches Abfragen diese 
Information das Kommunikationsprogramm. Dort wird dann die jeweilige 
Pumpe angesteuert.
htaccess ist glaube ich eh die sichere Variante.

Danke!

von Peter (Gast)


Lesenswert?

Für zu hause mag das ja gehen, aber Datenübergabe mit Dateien ist sehr 
unsauber. Was passiert wenn die Datei gerade geschrieben wird und ein 
andere die Datei lesen will? Bei der Auftrag.dat das gleich problem wie 
willst du dort 2Aufträge reinschreiben (eventuell sogar gleichzeitig).

Für Solche sachen gibt es IPC
http://de.wikipedia.org/wiki/Interprozesskommunikation

von peter (Gast)


Lesenswert?

übrigens, ich wollte noch hinzufügen, dass diese "index"-Seite NACH der 
htaccess-Anmeldung auch eine HTML-Seite sein kann, diese braucht ja nur 
eine URL ausführen beim klick auf den jeweiligen Button.

;)

Danke

von peter (Gast)


Lesenswert?

Wie wäre denn eine solche IPC realisierbar?

Danke

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.