C als CGI einbinden
WauWau
- webserver
0 Christian Seiler0 WauWau0 Vinzenz0 WauWau0 Matti Maekitalo0 WauWau
0 Erwin0 Robert Bienert0 WauWau
Hola,
ich habe vor, eine in C geschriebene Anwendung (apache2 auf win2k) als CGI in meinen Webserver einzubinden. Wie gehe ich dabei vor?
Ich meine - wie erhält meine Datei die CGI-Umgebungsvariablen?
Wäre super wenn mir jemand helfen könnte. Ich habe zwar mal von c-als-cgi-einbinden-modulen gehört, habe aber keinen blassen schimmer.
WauWAu
Hallo WauWau,
ich habe vor, eine in C geschriebene Anwendung (apache2 auf win2k) als CGI in meinen Webserver einzubinden. Wie gehe ich dabei vor?
Naja, kompilieren und die .exe ins cgi-bin-Verzeichnis kopieren - dann sollte das gehen.
Ich meine - wie erhält meine Datei die CGI-Umgebungsvariablen?
Mit getenv aus der C-Standardbibliothek oder mit der globalen Variable environ - wie man sich halt auch sonst Umgebungsvariablen in C holt.
Viele Grüße,
Christian
Hallo Christian Seiler, (Cool, das {$name}-ding funktioniert, aber es könnte doch noch den Nachnamen wegschneiden, dann klingt es freundlicher.]
Naja, kompilieren und die .exe ins cgi-bin-Verzeichnis kopieren - dann sollte das gehen.
Ich habe kein CGI-Bin-Verzeichnis, aber ich werde mir dann mal eins anlegen. Eigentlich brauche ich die datei aber woanders, d.h. ich werde mir vielleicht doch keins anlegen. mal sehn.
Mit getenv aus der C-Standardbibliothek oder mit der globalen Variable environ - wie man sich halt auch sonst Umgebungsvariablen in C holt.
aja klar, d.h. kein problem, ich suche sowieso erst mal eine gute doku für C, da ich damit bis jetzt noch nicht programmiert habe, aber mir vorgenommen habe, mich mit dem thema "gründlicher" auseinanderzusetzen, da ich mir auch noch ein "Datentransfertool" in C programmieren wollte (eigentlich nur eine Art FTP-Client, der sich mit meinem Server verbindet, eine Windows-Explorer-ähnliche-Oberfläche bereitstellen soll und mit ein paar Assistenten sowie einer chm ausgestattet sein soll :-).
Ma sehn :-|)
WauWau
Hallo Wow Wau
Ich habe kein CGI-Bin-Verzeichnis, aber ich werde mir dann mal eins anlegen. Eigentlich brauche ich die datei aber woanders, d.h. ich werde mir vielleicht doch keins anlegen. mal sehn.
Du solltest eines konfigurieren, falls das eh' schon standardmäßig so ist :-). Es ist definitiv keine gute Idee, cgi-s innerhalb der Documentroot zu haben.
Mein apache-Buch sagt dazu:
<auszug>
Verwenden Sie ScriptAlias in der Konfigurationsdate Ihres Hosts. Verweisen Sie dabei auf einen sicheren Ort außerhalb Ihres Webbereichs. Das sorgt für erhöhte Sicherheit, weil die bösen Jungs Ihre Skripten nicht lesen und auf Schlupflöcher analysieren können. "Sicherheit durch Unklarheit" ist an sich kein besonders guter Grundsatz, schadet aber auch nicht, wenn weitere, bessere Vorsichtsmaßnahmen getroffen werden.
</auszug>
Denk daran, ein C-Programm kann man disassemblieren.
Freundliche Grüsse,
Vinzenz
Hola,
Du solltest eines konfigurieren, falls das eh' schon standardmäßig so ist :-). Es ist definitiv keine gute Idee, cgi-s innerhalb der Documentroot zu haben.
ich habe auch nur PHP's dort.
<auszug>
Verwenden Sie ScriptAlias in der Konfigurationsdate Ihres Hosts. Verweisen Sie dabei auf einen sicheren Ort außerhalb Ihres Webbereichs. Das sorgt für erhöhte Sicherheit, weil die bösen Jungs Ihre Skripten nicht lesen und auf Schlupflöcher analysieren können. "Sicherheit durch Unklarheit" ist an sich kein besonders guter Grundsatz, schadet aber auch nicht, wenn weitere, bessere Vorsichtsmaßnahmen getroffen werden.
</auszug>
hm - buch oder doku ;-) ?
Denk daran, ein C-Programm kann man disassemblieren.
dissamblwas?
WAuWau--
+-- WauWau Selfcode
| ss:) zu:) ls:< fo:~ de:] va:) ch:° n4:# rl:( br:< js:| ie:% fl:| mo:|
+-- WauWau Nostalgie
| Die Bedeutung des Bellens ("WauWau") liegt ursprünglich darin, dass ein
| Gruppenfremder gewarnt oder ihm Alarm signalisiert wird.
+-- WauWau Heute
| Heutzutage ist die Bedeutung von "WauWau": Achtung, hier kommt "WauWau"!
| Die Bedeutung liegt hierbei auf den "Wau", und zwar auf beiden.
+-- WauWau E-Mail
| Coming soon...
use Mosche;
Denk daran, ein C-Programm kann man disassemblieren.
dissamblwas?
Ein C-Programm wird kompiliert, dass heisst, in "Computersprache" übersetzt. Es ist möglich, aus dem Computerprogramm wieder auf das Ursprungsprogramm zu schließen. Nur zur Info, wenn du da Passwörter usw. abspeicherst -> die können ausgelesen werden, wen jemand an dein Programm kommt (ist schwerer als bei PHP oder so, aber möglch).
WAuWau--
Deine Signatur ist kaputt, da fehlt eine Zeilenschaltung.
Außerdem ist sie vielleicht ein wenig lang, Signaturen _sollten_ nicht länger als vier Zeilen sein. Nur so als Tip.
use Tschoe qw(Matti);
Hallo Matti Maekitalo,
Ein C-Programm wird kompiliert, dass heisst, in "Computersprache" übersetzt.
schon klar - du musst mich nicht für dumm verkaufen ;-)
Es ist möglich, aus dem Computerprogramm wieder auf das Ursprungsprogramm zu schließen.
mh - habe mal davon gelesen, dass es bei einem programm gehen soll, mit dem man perl kompilieren (heißt das so im deutschen) kann (? - weiß nicht mehr genau wo, klar ist, dass es auf jeden fall eigentlich nicht kompiliert wird). Naja, dort stand, es wäre unsicher, weil man an den sourcecode wieder rankommen würde - eben dem anschein nach dieses "dissambelieren" oder sowas.
Naja, mir ist es auf jeden fall unklar, wieso man aus einer kompilierten .exe an den source-code kommen sollte - afaik unmöglich - also, wo liegt der trick?
Nur zur Info, wenn du da Passwörter usw. abspeicherst -> die können ausgelesen werden, wen jemand an dein Programm kommt (ist schwerer als bei PHP oder so, aber möglch).
genau - wie? Ich meine, du musst ja anhand von 0en und 1en an den original-c-code rankommen, und das erscheint mir doch irgendwo als ein problem...
Deine Signatur ist kaputt, da fehlt eine Zeilenschaltung.
nö - die geht ganz gut, nur ich habe dummerweise meinen cursor auf die mit "--" beschriftete zeile gesetzt, deswegen wurde sie von der forensoftware nicht als eine solche erkannt.
Außerdem ist sie vielleicht ein wenig lang, Signaturen _sollten_ nicht länger als vier Zeilen sein. Nur so als Tip.
ja? Dann sollte ich sie kürzen :-) ich mache mich mal dran wenn ich mal wieder zeit habe ;-) -- neinnein, keine angst, noch heute abend (vielleicht).
WauWau
Hallo WauWau
Es ist möglich, aus dem Computerprogramm wieder auf das Ursprungsprogramm zu schließen.
Naja, mir ist es auf jeden fall unklar, wieso man aus einer kompilierten .exe an den source-code kommen sollte - afaik unmöglich - also, wo liegt der trick?
Es muss ja nicht 1:1 der source-code sein, aber die Struktur ist weitgehend die gleiche. Diese Technik nennt man auch Reverse Engineering.
Nur zur Info, wenn du da Passwörter usw. abspeicherst -> die können ausgelesen werden, wen jemand an dein Programm kommt (ist schwerer als bei PHP oder so, aber möglch).
genau - wie? Ich meine, du musst ja anhand von 0en und 1en an den original-c-code rankommen, und das erscheint mir doch irgendwo als ein problem...
Hat Dir Matti doch erklärt: Diese werden im kompilierten Programm abgelegt. C erkennt das Ende eines Strings an der Null (Null-terminierte Strings). Also sind Strings sogar lesbar, wenn Du die Exe in einem Editor Deiner Wahl öffnest, sogar in Notepad stechen die ins Auge. Dafür musst Du noch nicht einmal disassemblieren.
Freundliche Grüsse,
Vinzenz
Hallo Vinzenz,
Hat Dir Matti doch erklärt: Diese werden im kompilierten Programm abgelegt. C erkennt das Ende eines Strings an der Null (Null-terminierte Strings). Also sind Strings sogar lesbar, wenn Du die Exe in einem Editor Deiner Wahl öffnest, sogar in Notepad stechen die ins Auge. Dafür musst Du noch nicht einmal disassemblieren.
hm - wie kannst du dann passwörter speichern? Außerdem: Was für einen Unterschied macht es letztenendes, wenn die .exe irgendwo im root nicht in der cgi-bin liegt, wenn beim apachen sowieso eingestellt ist, dass er _alle_ "exe" ausführen soll (wie das auch immer geht) ?
wauWua
Hallo WauWau
hm - wie kannst du dann passwörter speichern? Außerdem: Was für einen Unterschied macht es letztenendes, wenn die .exe irgendwo im root nicht in der cgi-bin liegt, wenn beim apachen sowieso eingestellt ist, dass er _alle_ "exe" ausführen soll (wie das auch immer geht) ?
Ein klein wenig Lesestoff in Sachen cgi und security: http://www.w3.org/Security/Faq/wwwsf4.html
Freundliche Grüsse,
Vinzenz
Hallo WauWau,
Es ist möglich, aus dem Computerprogramm wieder auf das Ursprungsprogramm zu schließen.
mh - habe mal davon gelesen, dass es bei einem programm gehen soll, mit dem man perl
kompilieren (heißt das so im deutschen) kann (? - weiß nicht mehr genau wo, klar ist,
dass es auf jeden fall eigentlich nicht kompiliert wird). Naja, dort stand, es wäre
unsicher, weil man an den sourcecode wieder rankommen würde - eben dem anschein nach
dieses "dissambelieren" oder sowas.
Das ist aber auch nur der Anschein. Nein, Warum man an den Source kommt, hat andere Gruende:
dabei wird der Perl-Interpreter mit allen benoetigten Modulen und den Script
zusammengepackt. Die Exe-Datei ist dann nur noch ein kleines Entpack-Programm, das den
Perl-Interpreter mit entsprechenden Parametern ausfuehrt.
Naja, mir ist es auf jeden fall unklar, wieso man aus einer kompilierten .exe an den
source-code kommen sollte - afaik unmöglich - also, wo liegt der trick?
Natuerlich nicht. In der Exe-Datei steht Maschinen-Code. Der Maschinen-Code wurde von C
dorthin uebersetzt. Warum sollte es nicht umgekehrt moeglich sein?
Das bloede bei der Methode ist, dass Variablen- und Funktionsnamen weg sind. Und sonderlich
lesbar duerfte der Code auch nicht sein.
Nur zur Info, wenn du da Passwörter usw. abspeicherst -> die können ausgelesen werden,
wen jemand an dein Programm kommt (ist schwerer als bei PHP oder so, aber möglch).genau - wie? Ich meine, du musst ja anhand von 0en und 1en an den original-c-code
rankommen, und das erscheint mir doch irgendwo als ein problem...
Hardgecodete Strings liegen im Data-Segment einer Exe-Datei und sind mit einem beliebigen
Hex-Editor einsehbar.
Deine Signatur ist kaputt, da fehlt eine Zeilenschaltung.
nö - die geht ganz gut, nur ich habe dummerweise meinen cursor auf die mit "--"
beschriftete zeile gesetzt, deswegen wurde sie von der forensoftware nicht als eine
solche erkannt.
So ein Humbug. Wo dein komischer Coursor steht, ist der Software voellig egal. Er war kaputt,
es fehlte ein Zeilenumbruch.
Grüße,
CK
hi,
ich habe vor, eine in C geschriebene Anwendung (apache2 auf win2k) als CGI in meinen Webserver einzubinden. Wie gehe ich dabei vor?
Ich meine - wie erhält meine Datei die CGI-Umgebungsvariablen?
na dann fang mal damit an
http://www.geologie.uni-freiburg.de/root/system/access/cgic.html
bzw. für die Weiterbildung Stichworte "Thomas Boutell" und
cgi c library
Gruss, Rolf
Hola,
Ole!
ich habe vor, eine in C geschriebene Anwendung (apache2 auf win2k) als CGI in meinen Webserver einzubinden. Wie gehe ich dabei vor?
Ich denke, dazu haben die anderen schon viel Gutes geschrieben. Wichtig ist, dass die erste Ausgabe deiner CGI-Anwendung ein _gültiger_ HTTP-Header sein muss, ansonsten verweigert der Apache die Mitarbeit; wichtig ist vor allem ein Content-Type Header.
(Nur mal so am Rand: Muss es unbedingt C sein? C speichert Zeichenketten als Pointer auf einen Speicherbereich, der mit einem Null-Byte abgeschlossen wird. Damit kann man sich schön in den Fuß schießen. C++ hat zwar mit Pointern auch so seine Probleme und ist von der Performance nicht ganz so toll wie C, bietet aber gute Klassen, mit denen sich viel Stress ersparen kann.)
Ich meine - wie erhält meine Datei die CGI-Umgebungsvariablen?
Per getenv(), dem du den Namen der Umgebungsvariable übergeben musst oder mit der globalen Variable environ, die alle Umgebungsvariablen als Array enthält. Wenn du wissen willst, welche Variablen alle gesetzt sind, kannst du ein Testprogramm schreiben, das folgendes macht:
int i;
for (i = 0; environ[i]; ++i)
puts(environ[i]);
Wäre super wenn mir jemand helfen könnte. Ich habe zwar mal von c-als-cgi-einbinden-modulen gehört, habe aber keinen blassen schimmer.
Hab auch nur mal Testweise damit gespielt.
WauWAu
Robert
Hola Robert,
Wichtig ist, dass die erste Ausgabe deiner CGI-Anwendung ein _gültiger_ HTTP-Header sein muss, ansonsten verweigert der Apache die Mitarbeit; wichtig ist vor allem ein Content-Type Header.
Hm - gut, dessen bin ich mir bewusst ("Content-type: text/html", etc.)
(Nur mal so am Rand: Muss es unbedingt C sein?
Nö, ich will mir auch nur etwas "schnelleres" als das folgende in PHP gebaute "Programm" bauen:
<?
function footer()
{
?>
<div style="font: 12px Verdana; color: #414141; border:1px dashed #888888; padding: 4px 4px 4px 40px; margin: 20px 5px; background: #EFEFEF url(/images/ressources.gif) 4px 4px no-repeat;">
<b style="font: 15px Verdana; font-weight: bold;">WauwauWebserver :: Ressourcen</b>
<br>Die Adresse dieses Dokumentes lautet: <tt style="color:#404040;">http://sveni/<?=$_SERVER["REQUEST_URI"]; ?></tt>
<br>Dieses Dokument wird von den <a href="/server/ressources/" style="color:#414141;text-decoration:underline;font-weight:bold;">WauWau - Ressourcen</a> zur Verfügung gestellt.
<br><?=$_SERVER["SERVER_SIGNATURE"]; ?>
</div>
<?
}
if($_SERVER["SCRIPT_NAME"] != $_SERVER["REQUEST_URI"])
{
readfile($_SERVER["PATH_TRANSLATED"]);
footer();
}
else
footer();
?>
der Apache ruft dann für alle html-dateien in dem verzeichnis /server/ressources/ das ding auf, welches dynamisch einen "footer" dranhängt. Ich dachte, mit C könnte man das schneller machen, da das ja immerhin ganz schön oft aufgerufen wird.
C speichert Zeichenketten als Pointer auf einen Speicherbereich, der mit einem Null-Byte abgeschlossen wird. Damit kann man sich schön in den Fuß schießen. C++ hat zwar mit Pointern auch so seine Probleme und ist von der Performance nicht ganz so toll wie C, bietet aber gute Klassen, mit denen sich viel Stress ersparen kann.)
Ich habe momentan noch kein bisschen richtig ahnung von C.
Per getenv(), dem du den Namen der Umgebungsvariable übergeben musst oder mit der globalen Variable environ, die alle Umgebungsvariablen als Array enthält. Wenn du wissen willst, welche Variablen alle gesetzt sind, kannst du ein Testprogramm schreiben, das folgendes macht:
int i;
for (i = 0; environ[i]; ++i)
puts(environ[i]);
ich werd's mal probieren.
Wäre super wenn mir jemand helfen könnte. Ich habe zwar mal von c-als-cgi-einbinden-modulen gehört, habe aber keinen blassen schimmer.
Hab auch nur mal Testweise damit gespielt.
aja - klar.
wauWau