Dieter: Mein CGI-Formular läuft nicht (Fehlersuche)

Hallo,
ich möchte ein kleine CGI-Formular bereitstellen, bekoome aber laufend den 500-Error.
(Basepath, Pfad zum mailserver  und perlpfad #!/usr/bin/perl5 sind korrekt).
Kann jemand helfen, hier der kleine Hack:

#!usr/bin/perl5
##################################
$basepath='/myserver.com/';

#######################################################
if ($form{'action'} eq 'feedback') { &feedback; }
$mailserver = "/usr/sbin/sendmail";

#######################################################

print "Content-Type: text/html\n\n";
#########################################################

if ($form{'action'} eq 'feedback') { &feedback; }
print <<"EOF";
<html>
<head>
<title>Feedback</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#FFFFFF" background="images/bg.jpg">
<form method="POST" input type="hidden" name="action" value="feedback" action="$ENV{'SCRIPT_NAME'}">

<p align="center"><font color="#80000" size="5"> Feedback</font></p>
  <p align="center"><img src="images//logo.gif" width="120" height="120"></p>
  <p align="center"><TR>
    <TD VALIGN=TOP>  </TD>
    <TD>
<div align="center">
    <table width="70%" border="0">
      <tr>
        <td>Ihr Name:</td>
            <td>
              <input type="radio" name="Frau" >
              Frau
              <input type="radio" name="Herr" >
              Herr
              <input type="text" name="name" size="35" maxlength="35" >
        </td>
      </tr>
      <tr>
        <td>Ihre EMail-Adresse:</td>
        <td>
          <input type="text" name="email" size="35" maxlength="35" >
          (optional) </td>
      </tr>
      <tr>
        <td>Ihre Telefonnummer: </td>
        <td>
          <input type="text" name="telefon" size="35" maxlength="35" >
          (optional) </td>
      </tr>
      <tr>
        <td>Bitte rufen Sie mich zurück</td>
            <td>
              <input type="checkbox" name="TelefonJa" >
              Ja, zwischen
              <input type="text" name="textfield2" size="20">
              Uhr
              <input type="checkbox" name="TelefonNein" >
              Nein </td>
      </tr>
      <tr>
            <td>Bitte antworten Sie mir per EMail</td>
            <td>
              <input type="checkbox" name="emailJa">
              Ja
              <input type="checkbox" name="emailnein" >
              Nein </td>
      </tr>
    </table>
    <br>
  </div>
  <center>Ihre Wünsche, Fragen, Anregungen:</center>
  <p align="center">
    <textarea name="text" cols="50" rows="6" ></textarea>
  </p>
  <p align="center"> </p>
  <p align="center">
    <input type="submit" name="Submit" value="Abschicken">
    <input type="reset" name="delete" value="Inhalt löschen">
  </p>
</form>
</body>
</html>
EOF
##############################################
sub sendemail {
$TO=$_[0];  @TO=split('\0',$TO);
$SUBJECT=$_[1];
$REPLYTO=$_[2];
$REMOTE = $_[3];
$THEMESSAGE = $_[4];

open(S, "$REMOTE -t");  

print S "To: $TO[0]\n";  
print S "From: <SMTPMAIL>\n";  
print S "Subject: $SUBJECT\n";  
print S "Reply-To: $REPLYTO\n\n";  

# Print the body  
print S "$THEMESSAGE\n";  
print S "\n";  
print S ".\n";  
close (S);  

}
sub feedback {
&oops('email') unless ($form{'email'});    
&oops('Text') unless ($form{'Text'});
$form{'EMAIL'} = $email;
&sendemail('Feedback', $form{'EMAIL'}, $mailserver, "$form{'Text'}, $form{'email'}, $form{'telefon'}");
print "<CENTER><B>Vielen Dank, Ihr Feedback ist bei uns angekommen! </B>Clicken Sie bitte <a href='http://www.myscript.de'>Hier</a> um zurückzukehren</CENTER>"
}
sub oops {
print "Bitte geben sie in jedem Fall Ihre EMail-adresse und einen Text ein. Drücken Sie den Back-Button Ihres Browsers um zurückzukehren";
}

  1. Hallo,
    ich möchte ein kleine CGI-Formular bereitstellen, bekoome aber laufend den 500-Error.
    (Basepath, Pfad zum mailserver  und perlpfad #!/usr/bin/perl5 sind korrekt).
    Kann jemand helfen, hier der kleine Hack:

    Du willst es doch wohl niemanden zumuten, hier den ganzen Code durchzugehen. Guck mal ins Errorlog, da solltest Du eine genauere Fehlermeldung finden. Mit der darfst Du dich dann melden.

    cu,
    Peter

    1. Wenn Du es nicht durchgehen willst, dann tue es nicht, die Frage richtet sich an die, denen Perl Spass macht, und die ein kleines Script gerne durchsehen
      Gruß
      Dieter

      1. Wenn Du es nicht durchgehen willst, dann tue es nicht, die Frage richtet sich an die, denen Perl Spass macht, und die ein kleines Script gerne durchsehen

        Solche eine Einstellung mag ich gerne: Zeige keine Eigeninitiative und gucke ja nicht in Logfile, das ist zuviel Arbeit. Auf  ensthafte Tips zur Selbsthilfe reagiere mit Ignoranz. Lasse dir lieber alles vorkauen.

        Peter

        1. Solche eine Einstellung mag ich gerne: Zeige keine Eigeninitiative und gucke ja nicht in Logfile, das ist zuviel Arbeit. Auf  ensthafte Tips zur Selbsthilfe reagiere mit Ignoranz. Lasse dir lieber alles vorkauen.

          (Zu) viele Leute haben halt (noch) keinen lokalen Webserver und beim Provider keinen Zugriff auf die Log-Datei.
          Also: chambre, chambre, wie der Ägypter sagt.

          1. Danke für die Tipps, probiere es erneut!

  2. Hi Dieter!

    Ich hab Dein Script kurz überflogen:

    hier rufst Du die Funktion feedback, die die Var $mailserver nutzt. Diese wird aber erst danach zugewiesen.

    if ($form{'action'} eq 'feedback') { &feedback; }
    $mailserver = "/usr/sbin/sendmail";

    Außerdem: muss die Zuweisung nicht so aussehen:
    $mailserver = '/usr/sbin/sendmail';
    (Bin mir nicht sicher...)

    Noch ein Tip: Es ist ein Sicherheitsrisiko, ungeparste Eingaben eines Users zu nutzen. Lies mal bei http://cgi.xwolf.com/security/index.shtml nach.

    Gruß Frank

    1. Hi Dieter!

      Ich hab Dein Script kurz überflogen:

      hier rufst Du die Funktion feedback, die die Var $mailserver nutzt. Diese wird aber erst danach zugewiesen.

      if ($form{'action'} eq 'feedback') { &feedback; }
      $mailserver = "/usr/sbin/sendmail";

      Außerdem: muss die Zuweisung nicht so aussehen:
      $mailserver = '/usr/sbin/sendmail';
      (Bin mir nicht sicher...)

      Noch ein Tip: Es ist ein Sicherheitsrisiko, ungeparste Eingaben eines Users zu nutzen. Lies mal bei http://cgi.xwolf.com/security/index.shtml nach.

      Gruß Frank

      aus dem gedaechtnis wuerde ich (ohne garantie) sagen, dass wenn bei sendmail die option -t fehlt, jeder als emailadresse irgendwas@blafasel.de;rm * eingeben koennte....dann waeren alle CGIs weg.....

  3. hallo,

    damit du die freude an perl nie verlieren wirst, hier ein paar tips:

    #!usr/bin/perl5

    1. in der ersten zeile fehlt ein /, soll heißen: #!/usr/bin/perl5, ansonsten sucht er relativ vom ausführungsort des scripts nach dem interpreter

    2. um mehr zu sehen als nur Internal server error 500, kannst du eine art debugging während der entwicklungszeit einschalten, indem du ein modul verwendest, daß dir die ausgabe des scripts im fehlerfall (welche man am linux-prompt sehen würde) an den browser schickt:
    use CGI::Carp qw(fatalsToBrowser)

    für weitere fragen gern verfügbar,

    gerhard a. HC

    1. 1. Bei mir laeuft das script sofort, wenn ich in der ersten zeile #!/usr/bin/perl stehen hab und in der siebten zeile den ; vor der } weglasse...
      2. geht viel einfacher, wenn er telnetzugriff auf eine linux/unix-kiste hat, auf der perl installiert ist...einfach script hochladen und ./scriptname.pl eingeben (vorher evtl. chmod 770)

      hallo,

      damit du die freude an perl nie verlieren wirst, hier ein paar

      #!usr/bin/perl5

      1. in der ersten zeile fehlt ein /, soll heißen: #!/usr/bin/perl5, ansonsten sucht er relativ vom ausführungsort des scripts nach dem interpreter

      2. um mehr zu sehen als nur Internal server error 500, kannst du eine art debugging während der entwicklungszeit einschalten, indem du ein modul verwendest, daß dir die ausgabe des scripts im fehlerfall (welche man am linux-prompt sehen würde) an den browser schickt:
        use CGI::Carp qw(fatalsToBrowser)

      für weitere fragen gern verfügbar,

      gerhard a. HC

  4. Ok, Danke an alle für die Hilfe, hier ist die aktuelle Fassung, Jetzt habe ich nur noch eine Frage:
    Die Sub feedback scheint trotz der if-Aussage am Anfang nicht aufgerufen zu werden, kann jemand sagen wieso?
    Gruß
    Dieter

    #!/usr/bin/perl5

    $adminemail = 'mymail@com';

    ##################################
    $basepath='/myserver.com/';

    #######################################################

    $mailserver = '/usr/sbin/sendmail';
    #if ($form{'action'} eq 'feedback') { &feedback; }
    #######################################################

    print "Content-Type: text/html\n\n";
    #########################################################
    &get_form_data; # parse arguments from post
    @ARGV = split(/\*&/, $ENV{'QUERY_STRING'});
    $ARGV[0] =~ s/\W//g;
    #&feedback;
    if ($form{'action'} eq 'feedback') { &feedback; }
    print <<"EOF";
    <html>
    <head>
    <title>Feedback</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    </head>

    <body bgcolor="#FFFFFF" background="http://images/bg.jpg">
    <form method="POST" input type="hidden" name='action' value='feedback' action="$ENV{'SCRIPT_NAME'}">

    <p align="center"><font color="#80000" size="5">Feedback</font></p>
      <p align="center"><img src="http://images/logo.gif" width="120" height="120"></p>
      <p align="center"><TR>
        <TD VALIGN=TOP>  </TD>
        <TD>
    <div align="center">
        <table width="70%" border="0">
          <tr>
            <td>Ihr Name:</td>
                <td>
                  <input type="radio" name="Frau" >
                  Frau
                  <input type="radio" name="Herr" >
                  Herr
                  <input type="text" name="name" size="35" maxlength="35" >
            </td>
          </tr>
          <tr>
            <td>Ihre EMail-Adresse:</td>
            <td>
              <input type="text" name="email" size="35" maxlength="35" >
              (optional) </td>
          </tr>
          <tr>
            <td>Ihre Telefonnummer: </td>
            <td>
              <input type="text" name="telefon" size="35" maxlength="35" >
              (optional) </td>
          </tr>
          <tr>
            <td>Bitte rufen Sie mich zurück</td>
                <td>
                  <input type="checkbox" name="TelefonJa" >
                  Ja, zwischen
                  <input type="text" name="textfield2" size="20">
                  Uhr
                  <input type="checkbox" name="TelefonNein" >
                  Nein </td>
          </tr>
          <tr>
                <td>Bitte antworten Sie mir per EMail</td>
                <td>
                  <input type="checkbox" name="emailJa">
                  Ja
                  <input type="checkbox" name="emailnein" >
                  Nein </td>
          </tr>
        </table>
        <br>
      </div>
      <center>Ihre Wünsche, Fragen, Anregungen:</center>
      <p align="center">
        <textarea name="text" cols="50" rows="6" ></textarea>
      </p>
      <p align="center"> </p>
      <p align="center">
        <input type="submit" name="Submit" value="Abschicken">
        <input type="reset" name="delete" value="Inhalt löschen">
      </p>
    </form>
    </body>
    </html>
    EOF
    if ($form{'action'} eq 'feedback') { &feedback; }
    sub feedback {
    &oops('Email') unless ($form{'email'});    
    &oops('Text') unless ($form{'Text'});
    #$form{'EMAIL'} = $email;
    &sendemail($adminemail, 'Feedback', $form{'EMAIL'}, $mailserver, "$form{'text'}, $form{'email'}, $form{'telefon'}");
    print "<CENTER><B>Vielen Dank, $form{'Name'}, Ihr Feedback ist bei uns angekommen! </B>Clicken Sie bitte <a href='http://www.vinoveritas.de'>Hier</a> um zurückzukehren</CENTER>"
    }
    sub oops {
    print "Bitte geben Sie in jedem Fall Ihre EMail-Adresse und einen Text ein. Drücken Sie den Back-Button Ihres Browsers um zurückzukehren";
    }

    ##############################################
    sub sendemail {
    $TO=$_[0];  @TO=split('\0',$TO);
    $SUBJECT=$_[1];
    $REPLYTO=$_[2];
    $REMOTE = $_[3];
    $THEMESSAGE = $_[4];

    open(S, "$REMOTE -t");  
    
    print S "To: $TO[0]\n";  
    print S "From: <SMTPMAIL>\n";  
    print S "Subject: $SUBJECT\n";  
    print S "Reply-To: $REPLYTO\n\n";  
    
    # Print the body  
    print S "$THEMESSAGE\n";  
    print S "\n";  
    print S ".\n";  
    close (S);  
    

    }

    Sub: Get Form Data

    This gets data from a post.

    sub get_form_data {
    $buffer = "";
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    @pairs=split(/&/,$buffer);
    foreach $pair (@pairs)
    {
      @a = split(/=/,$pair);
      $name=$a[0];
      $value=$a[1];
      $value =~ s/+/ /g;
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
      $value =~ s/~!/ ~!/g;
      $value =~ s/[\n\r]/ /sg;  #remove \n
      $value =~ s/[]//g;  #remove []
      push (@data,$name);
      push (@data, $value);
    }
    %form=@data;
    %form;
    }

    1. Die Sub feedback scheint trotz der if-Aussage am Anfang nicht aufgerufen zu werden, kann jemand sagen wieso?
      #if ($form{'action'} eq 'feedback') { &feedback; }
      #&feedback;

      "#" ist ein Kommentarzeichen für den Rest der Zeile. Dein Aufruf ist also gar nicht aktiv.

      1. Diese Zeile ist auskommentiert, weil es weiter unten noch einmal steht.