::: FORUM ManuFrog :::: Mailformulär i php! - ::: FORUM ManuFrog :::

Hoppa till innehåll

Sida 1 av 1
  • Du kan inte skapa ett nytt ämne
  • Du kan inte svara i detta ämne

Mailformulär i php! Tutorial för att skapa?

#1 Medlemmen är offline   joacim 

  • WebbPucko
  • PipPipPipPipPip
  • Grupp: Members
  • Inlägg: 49
  • Gick med: 13-mars 05

Postad 31 juli 2005 - 11:06

Hej!
Kan någon tipsa om vilka filer, php-kod samt mappar jag behöver för att göra ett mailformulär med data som avsändare, e-postadress samt ev om IP-adress för avsändaren kan komma med...

Vinsten skulle vara för mig att ingen vet min e-postadress innan jag svarat, samt att den inte går att söka och därmed kan jag slippa spam.

Är detta riktigt?

Hoppas på hjälp eller hänvisning!

// Joacim
0

#2 Medlemmen är offline   RedCity 

  • Member
  • PipPipPip
  • Grupp: Members
  • Inlägg: 7
  • Gick med: 22-november 04

Postad 01 augusti 2005 - 06:03

Använd lämpliga formulärrutor för att skicka data till variablerna, sedan är det bara att köra koden.
<?php 
$r_hostname = $HTTP_SERVER_VARS["REMOTE_ADDR"]; // avsändarens IP-nummer
$datumotid2  = date("Y-m-d H:i"); // tidpunkt
$comments = $Adress2 ."\r\n". $Postadress2 ."\r\n". $epost ."\r\n". $Telefon ."\r\n\r\n";
$comments .= "och vill:\r\n" . $textarea;

// ----------
$message = $r_hostname."\r\n\r\n".$datumotid2."\r\n".$Namn."\r\n".$comments."\n\n \r\n";

//----------
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=iso-8859-1\r\n";
$headers .= "Content-Transfer-Encoding: 8bit\r\n";
$headers .= "X-Priority: 3\r\n";
$headers .= "X-Mailer: php\r\n";
$headers = "From: Hemsidan ".$siteusersname." <".$siteusersemail.">\n";
$headers .= "Reply-To: ".$siteusersname." <".$siteusersemail.">\n";
$headers .= "Return-path: ".siteusersemail."\r\n"; 
//-----------

mail($siteusersname." <".$siteusersemail.">","Kontakttalong från hemsidan",$message,$headers);

?>

0

#3 Medlemmen är offline   joacim 

  • WebbPucko
  • PipPipPipPipPip
  • Grupp: Members
  • Inlägg: 49
  • Gick med: 13-mars 05

Postad 04 augusti 2005 - 21:24

Jag e nog lite puckad.
Men det här e grekiska för mig...

Ingen som skulle vilja göra en guide för mig, min domän är "hamragard.com".
Skriva vilka koder som skall vara på vilka sidor ( vad jag skall döpa de till) samt i vilka mappar de skall ligga?

Om någon vill lösa det mot betalning så ge mig ett pris!

Ytterst tacksam för hjälp!

// Joacim
0

#4 Medlemmen är offline   Pezzen 

  • Moderator
  • PipPipPipPipPipPip
  • Grupp: Moderator
  • Inlägg: 153
  • Gick med: 30-januari 04

Postad 05 augusti 2005 - 03:20

Kika lite på ett script, typ http://www.xentrik.n...hp/mailform.php om det kan hjälpa dig?

Packa upp zip-filen.
Redigera de sakerna som ska redigerast överst i filen.
Ladda upp den till valfri mapp på ditt konoto hos manufrog.

Du kan döpa filen till vad du vill (bara den slutar på .php) och det borde inte vara så svårt att få den att fungera. Om du behöver mer hjälp, tveka inte att svara i tråden!
Regards
Stefan/Pezzen
0

#5 Medlemmen är offline   joacim 

  • WebbPucko
  • PipPipPipPipPip
  • Grupp: Members
  • Inlägg: 49
  • Gick med: 13-mars 05

Postad 05 augusti 2005 - 15:56

Hej Pezzen!
Det funkade fint.

Fast egentligen var det ju ett sånt script eller php-formulär som INTE visade min e-mail som jag hade i åtanke.
Hehe, Nu var det som vanligt bara att högerklicka, visa källa och hitta min e-post...
Hehe, nåja, nu har jag ett snygt formulär iaf!

TACK för hjälpen...

// Joacim
0

#6 Medlemmen är offline   Pezzen 

  • Moderator
  • PipPipPipPipPipPip
  • Grupp: Moderator
  • Inlägg: 153
  • Gick med: 30-januari 04

Postad 05 augusti 2005 - 18:49

Var någonstans syns din maiadress om man kikar på källan?

När jag kikar på exemplet (http://www.xentrik.net/php/mailform/) så ser jag ingenstans vart mailet går, om du menar det du fyller i i början:
// your name
$recipientname = "YOUR NAME";

// your email
$recipientemail = "YOU@YOURDOMAIN.COM";
så kan jag informera om att det är kod som bara webservern kan se, och du som tittar på källan, an vanlig anväändare kan under normala omständigheter ALDRIG se php-källkod.
Om jag har fel och den faktiskt syns finns det ett enkelt hack jag kan hjälpa dig med för att dölja den.
Regards
Stefan/Pezzen
0

#7 Medlemmen är offline   Benzocaine 

  • VIP Member
  • PipPipPipPipPipPip
  • Grupp: Members
  • Inlägg: 54
  • Gick med: 30-augusti 04

Postad 16 augusti 2005 - 15:48

Hur gör man för att förhindra "hijacking"? Jag hade tidigare ett Perl-formulär med ungefär samma funktion, men någon angav en lång rad under avsändare så att en massa andra mottagare kom med i mailet.

Om vi antar att meningen var att man skulle ange avsändare: dittnamn@dinserver

Så angav de istället: vilketnamnsomhelst@minserver\n;To: fleraanvändare@andraservrar, vilket medförde att headern fick fler rader än det var tänkt och alltså även fler mottagare. Om headern var tänkt att se ut så här:

To: minadress@minserver
From: dittnamn@dinserver
Subject: Dittärende

Såg den istället ut så här:

To: minadress@minserver
From: vilketnamnsomhelst@minserver
To: Fleraanvändare@andraservrar
Subject: Dittärende

Som tur är hade jag ställt in formuläret så att det enbart skickade till mottagare på min egen domän, så inget spam gick ut till andra, men eftersom det j-a hijack-skriptet kidnappade mitt skript varje minut eller så fick jag 500 mails per dygn.

Så här såg koden ut; kan man undvika samma kidnappning med det PHP-skript du föreslog? (Alla epostadresser i koden har ersatts med a@b för att inte hittas av spambots, och alla domäner med domän1, domän2, osv).

#!/usr/bin/perl
##############################################################################
# FormMail                        Version 1.9                                #
# Copyright 1995-2001 Matt Wright mattw@b                    #
# Created 06/09/95                Last Modified 08/03/01                     #
# Matt's Script Archive, Inc.:    http://www.worldwidemart.com/scripts/      #
##############################################################################
# COPYRIGHT NOTICE                                                           #
# Copyright 1995-2001 Matthew M. Wright  All Rights Reserved.                #
#                                                                            #
# FormMail may be used and modified free of charge by anyone so long as this #
# copyright notice and the comments above remain intact.  By using this      #
# code you agree to indemnify Matthew M. Wright from any liability that      #
# might arise from its use.                                                  #
#                                                                            #
# Selling the code for this program without prior written consent is         #
# expressly forbidden.  In other words, please ask first before you try and  #
# make money off of my program.                                              #
#                                                                            #
# Obtain permission before redistributing this software over the Internet or #
# in any other medium.	In all cases copyright and header must remain intact #
##############################################################################
# ACCESS CONTROL FIX: Peter D. Thompson Yezek                                #
#                     http://www.securityfocus.com/archive/1/62033           #
##############################################################################
# Define Variables                                                           #
#  Detailed Information Found In README File.                          #

# $mailprog defines the location of your sendmail program on your unix       #
# system.                                                                    #
$mailprog = '/usr/lib/sendmail';

# Only allow me as the recipient
$recipient = 'minadress@minserver';

# @referers allows forms to be located only on servers which are defined     #
# in this field.  This security fix from the last version which allowed      #
# anyone on any server to use your FormMail script on their web site.        #

@referers = ('server1.com', 'www.server1.com', 'server2.net', 'www.server2.net', 'server3.se', 'www.server3.se');

# @recipients defines the e-mail addresses or domain names that e-mail can   #
# be sent to.  This must be filled in correctly to prevent SPAM and allow    #
# valid addresses to receive e-mail.  Read the documentation to find out how #
# this variable works!!!  It is EXTREMELY IMPORTANT.                         #
@recipients = @referers;

# ACCESS CONTROL FIX: Peter D. Thompson Yezek                                #
# @valid_ENV allows the sysadmin to define what environment variables can    #
# be reported via the env_report directive.  This was implemented to fix     #
# the problem reported at http://www.securityfocus.com/bid/1187              #

@valid_ENV = ('REMOTE_HOST','REMOTE_ADDR','REMOTE_USER','HTTP_USER_AGENT');

# Done                                                                       #
##############################################################################

# Check Referring URL
&check_url;

# Retrieve Date
&get_date;

# Parse Form Contents
&parse_form;

# Check Required Fields
&check_required;

# Send E-Mail
&send_mail;

# Return HTML Page or Redirect User
&return_html;

sub check_url {

    # Localize the check_referer flag which determines if user is valid.     #
    local($check_referer) = 0;

    # If a referring URL was specified, for each valid referer, make sure    #
    # that a valid referring URL was passed to FormMail.                     #

    if ($ENV{'HTTP_REFERER'}) {
        foreach $referer (@referers) {
            if ($ENV{'HTTP_REFERER'} =~ m|https?://([^/]*)$referer|i) {
                $check_referer = 1;
                last;
            }
        }
    }
    else {
        $check_referer = 1;
    }

    # If the HTTP_REFERER was invalid, send back an error.                   #
    if ($check_referer != 1) { &error('bad_referer') }
}

sub get_date {

    # Define arrays for the day of the week and month of the year.           #
    @days   = ('Sunday','Monday','Tuesday','Wednesday',
               'Thursday','Friday','Saturday');
    @months = ('January','February','March','April','May','June','July',
          'August','September','October','November','December');

    # Get the current time and format the hour, minutes and seconds.  Add    #
    # 1900 to the year to get the full 4 digit year.                         #
    ($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime(time))[0,1,2,3,4,5,6];
    $time = sprintf("%02d:%02d:%02d",$hour,$min,$sec);
    $year += 1900;

    # Format the date.                                                       #
    $date = "$days[$wday], $months[$mon] $mday, $year at $time";

}

sub parse_form {

    # Define the configuration associative array.                            #
    %Config = ('recipient','',          'subject','',
               'email','',              'realname','',
               'redirect','',           'bgcolor','',
               'background','',         'link_color','',
               'vlink_color','',        'text_color','',
               'alink_color','',        'title','',
               'sort','',               'print_config','',
               'required','',           'env_report','',
               'return_link_title','',  'return_link_url','',
               'print_blank_fields','', 'missing_fields_redirect','');

    # Determine the form's REQUEST_METHOD (GET or POST) and split the form   #
    # fields up into their name-value pairs.  If the REQUEST_METHOD was      #
    # not GET or POST, send an error.                                        #
    if ($ENV{'REQUEST_METHOD'} eq 'GET') {
        # Split the name-value pairs
        @pairs = split(/&/, $ENV{'QUERY_STRING'});
    }
    elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
        # Get the input
        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
 
        # Split the name-value pairs
        @pairs = split(/&/, $buffer);
    }
    else {
        &error('request_method');
    }

    # For each name-value pair:                                              #
    foreach $pair (@pairs) {

        # Split the pair up into individual variables.                       #
        local($name, $value) = split(/=/, $pair);
 
        # Decode the form encoding on the name and value variables.          #
        $name =~ tr/+/ /;
        $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

        # If they try to include server side includes, erase them, so they
        # aren't a security risk if the html gets returned.  Another 
        # security hole plugged up.
        $value =~ s/<!--(.|\n)*-->//g;

        # If the field name has been specified in the %Config array, it will #
        # return a 1 for defined($Config{$name}}) and we should associate    #
        # this value with the appropriate configuration variable.  If this   #
        # is not a configuration form field, put it into the associative     #
        # array %Form, appending the value with a ', ' if there is already a #
        # value present.  We also save the order of the form fields in the   #
        # @Field_Order array so we can use this order for the generic sort.  #
        if (defined($Config{$name})) {
            $Config{$name} = $value;
        }
        else {
            if ($Form{$name} && $value) {
                $Form{$name} = "$Form{$name}, $value";
            }
            elsif ($value) {
                push(@Field_Order,$name);
                $Form{$name} = $value;
            }
        }
    }

    # The next six lines remove any extra spaces or new lines from the       #
    # configuration variables, which may have been caused if your editor     #
    # wraps lines after a certain length or if you used spaces between field #
    # names or environment variables.                                        #
    $Config{'required'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
    $Config{'required'} =~ s/(\s+)?\n+(\s+)?//g;
    $Config{'env_report'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
    $Config{'env_report'} =~ s/(\s+)?\n+(\s+)?//g;
    $Config{'print_config'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
    $Config{'print_config'} =~ s/(\s+)?\n+(\s+)?//g;

    # Split the configuration variables into individual field names.         #
    @Required = split(/,/,$Config{'required'});
    @Env_Report = split(/,/,$Config{'env_report'});
    @Print_Config = split(/,/,$Config{'print_config'});

    # ACCESS CONTROL FIX: Only allow ENV variables in @valid_ENV in          #
    # @Env_Report for security reasons.                                      #
    foreach $env_item (@Env_Report) {
        foreach $valid_item (@valid_ENV) {
            if ( $env_item eq $valid_item ) { push(@temp_array, $env_item) }
        }
    } 
    @Env_Report = @temp_array;
}

sub check_required {

    # Localize the variables used in this subroutine.                        #
    local($require, @error);

    #if ($Config{'subject'} =~ /(\n|\r)/m || 
    #    $Config{'recipient'} =~ /(\n|\r)/m) {
    #    &error('no_recipient');
    #}

    #if (!$Config{'recipient'}) {
    #    if (!defined(%Form)) { &error('bad_referer') }
    #    else                 { &error('no_recipient') }
    #}
        
    if ($Config{'subject'} =~ /(\n|\r)/m || 
            $recipient =~ /(\n|\r)/m) {
            &error('no_recipient');
        }
    
        if (!$recipient) {
            if (!defined(%Form)) { &error('bad_referer') }
            else                 { &error('no_recipient') }
    }
    
    #else {
        # This block of code requires that the recipient address end with    #
        # a valid domain or e-mail address as defined in @recipients.        #
    #    $valid_recipient = 0;
    #    foreach $send_to (split(/,/,$Config{'recipient'})) {
    #        foreach $recipient (@recipients) {
    #            if ($send_to =~ /$recipient$/i) {
    #                push(@send_to,$send_to); last;
    #            }
    #        }
    #    }
    #    if ($#send_to < 0) { &error('no_recipient') }
    #    $Config{'recipient'} = join(',',@send_to);
    #}

    # For each require field defined in the form:                            #
    foreach $require (@Required) {

        # If the required field is the email field, the syntax of the email  #
        # address if checked to make sure it passes a valid syntax.          #
        if ($require eq 'email' && !&check_email($Config{$require})) {
            push(@error,$require);
        }

        # Otherwise, if the required field is a configuration field and it   #
        # has no value or has been filled in with a space, send an error.    #
        elsif (defined($Config{$require})) {
            if (!$Config{$require}) {
                push(@error,$require);
            }
        }

        # If it is a regular form field which has not been filled in or      #
        # filled in with a space, flag it as an error field.                 #
        elsif (!$Form{$require}) {
            push(@error,$require);
        }
    }

    # If any error fields have been found, send error message to the user.   #
    if (@error) { &error('missing_fields', @error) }
}

sub return_html {
    # Local variables used in this subroutine initialized.                   #
    local($key,$sort_order,$sorted_field);

    # If redirect option is used, print the redirectional location header.   #
    if ($Config{'redirect'}) {
        print "Location: $Config{'redirect'}\n\n";
    }

    # Otherwise, begin printing the response page.                           #
    else {

        # Print HTTP header and opening HTML tags.                           #
        print "Content-type: text/html\n\n";
        print "<html>\n <head>\n";

        # Print out title of page                                            #
        if ($Config{'title'}) { print "  <title>$Config{'title'}</title>\n" }
        else                  { print "  <title>Thank You</title>\n"        }

        print " </head>\n <body";

        # Get Body Tag Attributes                                            #
        &body_attributes;

        # Close Body Tag                                                     #
        print ">\n  <center>\n";

        # Print custom or generic title.                                     #
        if ($Config{'title'}) { print "   <h1>$Config{'title'}</h1>\n" }
        else { print "   <h1>Thank You For Filling Out This Form</h1>\n" }

        print "</center>\n";

        print "Below is what you submitted to $Config{'recipient'} on ";
        print "$date<p><hr size=1 width=75\%><p>\n";

        # Sort alphabetically if specified:                                  #
        if ($Config{'sort'} eq 'alphabetic') {
            foreach $field (sort keys %Form) {

                # If the field has a value or the print blank fields option  #
                # is turned on, print out the form field and value.          #
                if ($Config{'print_blank_fields'} || $Form{$field}) {
                    print "<b>$field:</b> $Form{$field}<p>\n";
                }
            }
        }

        # If a sort order is specified, sort the form fields based on that.  #
        elsif ($Config{'sort'} =~ /^order:.*,.*/) {

            # Set the temporary $sort_order variable to the sorting order,   #
            # remove extraneous line breaks and spaces, remove the order:    #
            # directive and split the sort fields into an array.             #
            $sort_order = $Config{'sort'};
            $sort_order =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
            $sort_order =~ s/(\s+)?\n+(\s+)?//g;
            $sort_order =~ s/order://;
            @sorted_fields = split(/,/, $sort_order);

            # For each sorted field, if it has a value or the print blank    #
            # fields option is turned on print the form field and value.     #
            foreach $sorted_field (@sorted_fields) {
                if ($Config{'print_blank_fields'} || $Form{$sorted_field}) {
                    print "<b>$sorted_field:</b> $Form{$sorted_field}<p>\n";
                }
            }
        }

        # Otherwise, default to the order in which the fields were sent.     #
        else {

            # For each form field, if it has a value or the print blank      #
            # fields option is turned on print the form field and value.     #
            foreach $field (@Field_Order) {
                if ($Config{'print_blank_fields'} || $Form{$field}) {
                    print "<b>$field:</b> $Form{$field}<p>\n";
                }
            }
        }

        print "<p><hr size=1 width=75%><p>\n";

        # Check for a Return Link and print one if found.                    #
        if ($Config{'return_link_url'} && $Config{'return_link_title'}) {
            print "<ul>\n";
            print "<li><a href=\"$Config{'return_link_url'}\">$Config{'return_link_title'}</a>\n";
            print "</ul>\n";
        }

        # Print the page footer.                                             #
        print <<"(END HTML FOOTER)";
        <hr size=1 width=75%><p> 
        <center><font size=-1><a href="http://www.worldwidemart.com/scripts/formmail.shtml">FormMail</a> V1.9 &copy; 1995 - 2001  Matt Wright<br>
A Free Product of <a href="http://www.worldwidemart.com/scripts/">Matt's Script Archive, Inc.</a></font></center>
        </body>
       </html>
(END HTML FOOTER)
    }
}

sub send_mail {
    # Localize variables used in this subroutine.                            #
    local($print_config,$key,$sort_order,$sorted_field,$env_report);

    # Open The Mail Program
    open(MAIL,"|$mailprog -t");

    # LINE BELOW REMOVED TO PREVENT SPAM. Now the address does not need to be defined in the HTML code:
    # print MAIL "To: $Config{'recipient'}\n";

    print MAIL "To: $recipient\n";
    print MAIL "From: $Config{'email'} ($Config{'realname'})\n";

    # Check for Message Subject
    if ($Config{'subject'}) { print MAIL "Subject: $Config{'subject'}\n\n" }
    else                    { print MAIL "Subject: WWW Form Submission\n\n" }

    print MAIL "Below is the result of your feedback form.  It was submitted by\n";
    print MAIL "$Config{'realname'} ($Config{'email'}) on $date\n";
    print MAIL "-" x 75 . "\n\n";

    if (@Print_Config) {
        foreach $print_config (@Print_Config) {
            if ($Config{$print_config}) {
                print MAIL "$print_config: $Config{$print_config}\n\n";
            }
        }
    }

    # Sort alphabetically if specified:                                      #
    if ($Config{'sort'} eq 'alphabetic') {
        foreach $field (sort keys %Form) {

            # If the field has a value or the print blank fields option      #
            # is turned on, print out the form field and value.              #
            if ($Config{'print_blank_fields'} || $Form{$field} ||
                $Form{$field} eq '0') {
                print MAIL "$field: $Form{$field}\n\n";
            }
        }
    }

    # If a sort order is specified, sort the form fields based on that.      #
    elsif ($Config{'sort'} =~ /^order:.*,.*/) {

        # Remove extraneous line breaks and spaces, remove the order:        #
        # directive and split the sort fields into an array.                 #
        $Config{'sort'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
        $Config{'sort'} =~ s/(\s+)?\n+(\s+)?//g;
        $Config{'sort'} =~ s/order://;
        @sorted_fields = split(/,/, $Config{'sort'});

        # For each sorted field, if it has a value or the print blank        #
        # fields option is turned on print the form field and value.         #
        foreach $sorted_field (@sorted_fields) {
            if ($Config{'print_blank_fields'} || $Form{$sorted_field} ||
                $Form{$sorted_field} eq '0') {
                print MAIL "$sorted_field: $Form{$sorted_field}\n\n";
            }
        }
    }

    # Otherwise, default to the order in which the fields were sent.         #
    else {

        # For each form field, if it has a value or the print blank          #
        # fields option is turned on print the form field and value.         #
        foreach $field (@Field_Order) {
            if ($Config{'print_blank_fields'} || $Form{$field} ||
                $Form{$field} eq '0') {
                print MAIL "$field: $Form{$field}\n\n";
            }
        }
    }

    print MAIL "-" x 75 . "\n\n";

    # Send any specified Environment Variables to recipient.                 #
    foreach $env_report (@Env_Report) {
        if ($ENV{$env_report}) {
            print MAIL "$env_report: $ENV{$env_report}\n";
        }
    }

    close (MAIL);
}

sub check_email {
    # Initialize local email variable with input to subroutine.              #
    $email = $_[0];

    # If the e-mail address contains:                                        #
    if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/ ||

        # the e-mail address contains an invalid syntax.  Or, if the         #
        # syntax does not match the following regular expression pattern     #
        # it fails basic syntax verification.                                #

        $email !~ /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z0-9]+)(\]?)$/) {

        # Basic syntax requires:  one or more characters before the @ sign,  #
        # followed by an optional '[', then any number of letters, numbers,  #
        # dashes or periods (valid domain/IP characters) ending in a period  #
        # and then 2 or 3 letters (for domain suffixes) or 1 to 3 numbers    #
        # (for IP addresses).  An ending bracket is also allowed as it is    #
        # valid syntax to have an email address like: user@[255.255.255.0]   #

        # Return a false value, since the e-mail address did not pass valid  #
        # syntax.                                                            #
        return 0;
    }

    else {

        # Return a true value, e-mail verification passed.                   #
        return 1;
    }
}

sub body_attributes {
    # Check for Background Color
    if ($Config{'bgcolor'}) { print " bgcolor=\"$Config{'bgcolor'}\"" }

    # Check for Background Image
    if ($Config{'background'}) { print " background=\"$Config{'background'}\"" }

    # Check for Link Color
    if ($Config{'link_color'}) { print " link=\"$Config{'link_color'}\"" }

    # Check for Visited Link Color
    if ($Config{'vlink_color'}) { print " vlink=\"$Config{'vlink_color'}\"" }

    # Check for Active Link Color
    if ($Config{'alink_color'}) { print " alink=\"$Config{'alink_color'}\"" }

    # Check for Body Text Color
    if ($Config{'text_color'}) { print " text=\"$Config{'text_color'}\"" }
}

sub error { 
    # Localize variables and assign subroutine input.                        #
    local($error,@error_fields) = @_;
    local($host,$missing_field,$missing_field_list);

    if ($error eq 'bad_referer') {
        if ($ENV{'HTTP_REFERER'} =~ m|^https?://([\w\.]+)|i) {
            $host = $1;
            print <<"(END ERROR HTML)";
Content-type: text/html

<html>
 <head>
  <title>Bad Referrer - Access Denied</title>
 </head>
 <body bgcolor=#FFFFFF text=#000000>
  <center>
   <table border=0 width=600 bgcolor=#9C9C9C>
    <tr><th><font size=+2>Bad Referrer - Access Denied</font></th></tr>
   </table>
   <table border=0 width=600 bgcolor=#CFCFCF>
    <tr><td>The form attempting to use
     <a href="http://www.worldwidemart.com/scripts/formmail.shtml">FormMail</a>
     resides at <tt>$ENV{'HTTP_REFERER'}</tt>, which is not allowed to access
     this cgi script.<p>

     If you are attempting to configure FormMail to run with this form, you need
     to add the following to \@referers, explained in detail in the README file.<p>

     Add <tt>'$host'</tt> to your <tt><b>\@referers</b></tt> array.<hr size=1>
     <center><font size=-1>
      <a href="http://www.worldwidemart.com/scripts/formmail.shtml">FormMail</a> V1.9 &copy; 1995 - 2001  Matt Wright<br>
      A Free Product of <a href="http://www.worldwidemart.com/scripts/">Matt's Script Archive, Inc.</a>
     </font></center>
    </td></tr>
   </table>
  </center>
 </body>
</html>
(END ERROR HTML)
        }
        else {
            print <<"(END ERROR HTML)";
Content-type: text/html

<html>
 <head>
  <title>FormMail v1.9</title>
 </head>
 <body bgcolor=#FFFFFF text=#000000>
  <center>
   <table border=0 width=600 bgcolor=#9C9C9C>
    <tr><th><font size=+2>FormMail</font></th></tr>
   </table>
   <table border=0 width=600 bgcolor=#CFCFCF>
    <tr><th><tt><font size=+1>Copyright 1995 - 2001 Matt Wright<br>
        Version 1.9 - Released August 3, 2001<br>
        A Free Product of <a href="http://www.worldwidemart.com/scripts/">Matt's Script Archive,
        Inc.</a></font></tt></th></tr>
   </table>
  </center>
 </body>
</html>
(END ERROR HTML)
        }
    }

    elsif ($error eq 'request_method') {
            print <<"(END ERROR HTML)";
Content-type: text/html

<html>
 <head>
  <title>Error: Request Method</title>
 </head>
 <body bgcolor=#FFFFFF text=#000000>
  <center>
   <table border=0 width=600 bgcolor=#9C9C9C>
    <tr><th><font size=+2>Error: Request Method</font></th></tr>
   </table>
   <table border=0 width=600 bgcolor=#CFCFCF>
    <tr><td>The Request Method of the Form you submitted did not match
     either <tt>GET</tt> or <tt>POST</tt>.  Please check the form and make sure the
     <tt>method=</tt> statement is in upper case and matches <tt>GET</tt> or <tt>POST</tt>.<p>

     <center><font size=-1>
      <a href="http://www.worldwidemart.com/scripts/formmail.shtml">FormMail</a> V1.9 &copy; 1995 - 2001  Matt Wright<br>
      A Free Product of <a href="http://www.worldwidemart.com/scripts/">Matt's Script Archive, Inc.</a>
     </font></center>
    </td></tr>
   </table>
  </center>
 </body>
</html>
(END ERROR HTML)
    }

    elsif ($error eq 'no_recipient') {
            print <<"(END ERROR HTML)";
Content-type: text/html

<html>
 <head>
  <title>Error: Bad/No Recipient</title>
 </head>
 <body bgcolor=#FFFFFF text=#000000>
  <center>
   <table border=0 width=600 bgcolor=#9C9C9C>
    <tr><th><font size=+2>Error: Bad/No Recipient</font></th></tr>
   </table>
   <table border=0 width=600 bgcolor=#CFCFCF>
    <tr><td>There was no recipient or an invalid recipient specified in the data sent to FormMail.  Please
     make sure you have filled in the <tt>recipient</tt> form field with an e-mail
     address that has been configured in <tt>\@recipients</tt>.  More information on filling in <tt>recipient</tt> form fields and variables can be
     found in the README file.<hr size=1>

     <center><font size=-1>
      <a href="http://www.worldwidemart.com/scripts/formmail.shtml">FormMail</a> V1.9 &copy; 1995 - 2001  Matt Wright<br>
      A Free Product of <a href="http://www.worldwidemart.com/scripts/">Matt's Script Archive, Inc.</a>
     </font></center>
    </td></tr>
   </table>
  </center>
 </body>
</html>
(END ERROR HTML)
    }

    elsif ($error eq 'missing_fields') {
        if ($Config{'missing_fields_redirect'}) {
            print "Location: $Config{'missing_fields_redirect'}\n\n";
        }
        else {
            foreach $missing_field (@error_fields) {
                $missing_field_list .= "      <li>$missing_field\n";
            }

            print <<"(END ERROR HTML)";
Content-type: text/html

<html>
 <head>
  <title>Error: Blank Fields</title>
 </head>
  <center>
   <table border=0 width=600 bgcolor=#9C9C9C>
    <tr><th><font size=+2>Error: Blank Fields</font></th></tr>
   </table>
   <table border=0 width=600 bgcolor=#CFCFCF>
    <tr><td>The following fields were left blank in your submission form:<p>
     <ul>
$missing_field_list
     </ul><br>

     These fields must be filled in before you can successfully submit the form.<p>
     Please use your browser's back button to return to the form and try again.<hr size=1>
     <center><font size=-1>
      <a href="http://www.worldwidemart.com/scripts/formmail.shtml">FormMail</a> V1.9 &copy; 1995 - 2001  Matt Wright<br>
      A Free Product of <a href="http://www.worldwidemart.com/scripts/">Matt's Script Archive, Inc.</a>
     </font></center>
    </td></tr>
   </table>
  </center>
 </body>
</html>
(END ERROR HTML)
        }
    }

    exit;
}


Som synes har jag modifierat Matt Wrights skript och behållit en del kod. Anledningen var att servern sade att det var fel på skriptet hela tiden när jag försökte ändra koden så jag fick ge upp det. Allra först försökte jag skriva skriptet från scratch men även då blev det fel i koden. Det är inte lätt att avlusa när man måste ändra filen, FTP:a upp den och köra den i webläsaren för att se om ändringen fungerade. Speciellt inte som jag då använde WS_FTP Lite som hela tiden loggades ut. Nu kör jag FileZilla som skickar anrop för att hålla sessionen igång, men det är fortfarande omständigt att felsöka ett Perl-skript. PHP är lika komplicerat att felsöka.

Problemet med mitt skript var alltså att man i webformuläret name=recipient kunde ange:

adress1@server \n To: fleraadresser@andraservrar

Man skulle ju t.ex kunna förhindra detta genom något regular som klipper bort allt efter den första giltiga adressen och ser till att strängen måste börja på engiltig adress.

Kan man hindra någon från att ladda hem PHP-filen? Vad händer om man skapar en HTML-sida som länkar till den, högerklickar och väljer "Save as"?
0

#8 Medlemmen är offline   Benzocaine 

  • VIP Member
  • PipPipPipPipPipPip
  • Grupp: Members
  • Inlägg: 54
  • Gick med: 30-augusti 04

Postad 16 augusti 2005 - 15:56

Jag försökte spara filen, men det gick inte, som du säger. Istället fick jag hem HTML-sidan som skriptet genererar.
0

#9 Medlemmen är offline   Pezzen 

  • Moderator
  • PipPipPipPipPipPip
  • Grupp: Moderator
  • Inlägg: 153
  • Gick med: 30-januari 04

Postad 18 augusti 2005 - 01:31

Jag är inte ett dugg inte på PERL tyvärr, så jag tänker inte ens på mig att försöka mig på att felsöka ditt perl-script.

Men, det scriptet jag rekomenderar här har en del som ser ut som följer
// check email address
if ((!ereg(".+\@.+\..+", $Email)) || (!ereg("^[a-zA-Z0-9_@.-]+$", $Email))){
$error .= "Invalid email address<br>";}

Den första biten kollar så att addressen som är inskriver i der fältet ser ut som "foo@bar.com" och den andra kollar så att t ex inte / eller ; ingår i adressen, så genom ditt sätt är det inte möjligt att skicka till flera adresser, och även om jag inte kan garantera att man inte kan använda flera adreser så kan jag lova att det INTE är lätt, och knappast mödan värt.
Regards
Stefan/Pezzen
0

#10 Medlemmen är offline   Benzocaine 

  • VIP Member
  • PipPipPipPipPipPip
  • Grupp: Members
  • Inlägg: 54
  • Gick med: 30-augusti 04

Postad 18 augusti 2005 - 17:50

Pezzen på 18 Aug 2005, 02:31 sade:

Jag är inte ett dugg inte på PERL tyvärr, så jag tänker inte ens på mig att försöka mig på att felsöka ditt perl-script.

Men, det scriptet jag rekomenderar här har en del som ser ut som följer
// check email address
if ((!ereg(".+\@.+\..+", $Email)) || (!ereg("^[a-zA-Z0-9_@.-]+$", $Email))){
$error .= "Invalid email address<br>";}

Den första biten kollar så att addressen som är inskriver i der fältet ser ut som "foo@bar.com" och den andra kollar så att t ex inte / eller ; ingår i adressen, så genom ditt sätt är det inte möjligt att skicka till flera adresser, och även om jag inte kan garantera att man inte kan använda flera adreser så kan jag lova att det INTE är lätt, och knappast mödan värt.

Jobbigt eller inte. Så fort spammare hittar säkerhetshål kommer de utnyttja dem. För dem är det mödan värt. Har du förslag på hur man kan modifiera skriptet så det inte kan skicka mer än t.ex 50 mails per dygn? Jag kan tänka mig flera spärrar i en, t.ex högst 10 per minut, 5 per timme och 50 per dygn.

Om en spammare mot förmodan skulle kunna använda skriptet kunde de i alla fall bara skicka några få mails innan man hann stänga luckan.
0

#11 Medlemmen är offline   Pezzen 

  • Moderator
  • PipPipPipPipPipPip
  • Grupp: Moderator
  • Inlägg: 153
  • Gick med: 30-januari 04

Postad 19 augusti 2005 - 13:28

I så fall är de lättare att bara köpa adresser, eller helt enkelt gissa, använda bruteforce, det är effektivare än att försöka hitta små hål i enskilda script som inte är distribuerade.

Dessutom, för mig handlar internet om kommunikation, och jag tycker inte om olika sätt att försöka begränsa den för någon. (Möjligvis undantaget barnporr-filtret). Jag skulle personligen i alla fall tycka det var fruktansvärt irriterande.

Det går förmodligen att göra en sån spärr, men för mig så skulle de ta för mycket tid i anspråk just nu, det känns som om de är att göra så mycket för så lite. Men, får jag tid i framtiden kan jag kika på det!
Regards
Stefan/Pezzen
0

#12 Medlemmen är offline   Benzocaine 

  • VIP Member
  • PipPipPipPipPipPip
  • Grupp: Members
  • Inlägg: 54
  • Gick med: 30-augusti 04

Postad 25 augusti 2005 - 23:27

Citat

I så fall är de lättare att bara köpa adresser, eller helt enkelt gissa, använda bruteforce, det är effektivare än att försöka hitta små hål i enskilda script som inte är distribuerade.


Nja. Det är ju bara att skriva en bot som skannar igenom webben efter mailskript och testar om det går att spamma genom dem. Går det lägger man det till databasen över skripts som går att kidnappa. Sedan kan man leta efter fler skript med samma namn. (Ett hett tips är t.ex att ordet "mail" ingår i filnamnet).

Citat

Dessutom, för mig handlar internet om kommunikation, och jag tycker inte om olika sätt att försöka begränsa den för någon. (Möjligvis undantaget barnporr-filtret). Jag skulle personligen i alla fall tycka det var fruktansvärt irriterande.


Spammare gör tyvärr att man måste begränsa kommunikationens möjligheter. Spam innebär ju i sig ett hinder för kommunikation. Hur stor andel av alla mails är det nuförtiden som är skräppost? Har det kommit över 90% än?

Citat

Det går förmodligen att göra en sån spärr, men för mig så skulle de ta för mycket tid i anspråk just nu, det känns som om de är att göra så mycket för så lite. Men, får jag tid i framtiden kan jag kika på det!


Det förstår jag självklart! Man måste prioritera det som är viktigast! För mig är det viktigt att kunna ha ett sätt för besökare att enkelt kontakta mig utan att jag drabbas av spam så för mig är det jätteviktigt. Annars blir kommunikationen försvårad. Nu får jag skriva något i stil med "Kontakta mig på adressen kontakt på mindomän.com" och det tycker jag är synd. Jag förstår om du har andra problem och möjligheter i livet som du prioriterar.
0

#13 Medlemmen är offline   Pezzen 

  • Moderator
  • PipPipPipPipPipPip
  • Grupp: Moderator
  • Inlägg: 153
  • Gick med: 30-januari 04

Postad 26 augusti 2005 - 14:38

Citat

Nja. Det är ju bara att skriva en bot som skannar igenom webben efter mailskript och testar om det går att spamma genom dem. Går det lägger man det till databasen över skripts som går att kidnappa. Sedan kan man leta efter fler skript med samma namn. (Ett hett tips är t.ex att ordet "mail" ingår i filnamnet).
För det första så finns inger någonstans som säger att man faktiskt behöver döpa filen till just mail. För det andra så gär det att hindra robotar från att söka ingenom din site, så har jag gjort och jag får i stort sett bara spam till den adress som jag har i whoisdatabasen.

Citat

Spammare gör tyvärr att man måste begränsa kommunikationens möjligheter. Spam innebär ju i sig ett hinder för kommunikation. Hur stor andel av alla mails är det nuförtiden som är skräppost? Har det kommit över 90% än?
Jag ser det faktiskt inte så, speciellt inte eftersom jag inte besväras av spam, det är så¨nt man får ta enligt min mening, precis som man får ta spam hem ibland, det har jag större problem med i så fall eftersom det går åt lite mer resurser åt det.

Citat

Det förstår jag självklart! Man måste prioritera det som är viktigast! För mig är det viktigt att kunna ha ett sätt för besökare att enkelt kontakta mig utan att jag drabbas av spam så för mig är det jätteviktigt. Annars blir kommunikationen försvårad. Nu får jag skriva något i stil med "Kontakta mig på adressen kontakt på mindomän.com" och det tycker jag är synd. Jag förstår om du har andra problem och möjligheter i livet som du prioriterar.
I så fall är det ju en avvägning du måste göra, ett script med risk för att få spam, eller inget script och gör det svårare för besökare att kontakta dig direkt. Det finns nog ingen gyllene medelväg där.
Regards
Stefan/Pezzen
0

#14 Medlemmen är offline   Benzocaine 

  • VIP Member
  • PipPipPipPipPipPip
  • Grupp: Members
  • Inlägg: 54
  • Gick med: 30-augusti 04

Postad 26 augusti 2005 - 23:22

Jag drabbas inte av spam nuförtiden, bland annat för att jag tagit bort mina mailskripts. Visst går det att ha andra namn på skripten, och så har jag gjort, men det hjälpte inte i alla fall. Problemet med att blockera robotar är dels att sökmotorer inte kan hitta sidan då, och dels att spam harvesters ignorerar reglerna. När man som jag, fick 600 spams på en dag på grund av skriptet blir man jäkligt restriktiv med sådant. Det är som att ha sex utan kondom ungefär. Om ens site dessutom blir svartlistad som spamsändare är det ännu värre. Som tur är har jag sluppit det.

Jag ska i alla fall kolla på ditt skript och se om jag kan förbättra det för att hindra spam-attacker. Om du vill kan jag posta resultatet här sedan.
0

#15 Medlemmen är offline   Pezzen 

  • Moderator
  • PipPipPipPipPipPip
  • Grupp: Moderator
  • Inlägg: 153
  • Gick med: 30-januari 04

Postad 27 augusti 2005 - 03:23

Man kan hindra robotar från att lista speciella filer och/eller mappar.
Och att DU skulle bli svartlistad som spamsändare än omöjligt så länge du sitter hos ett hostingföretags server, i så fall är det om de lyckas sno infon till din domäns SMTP server.

Och som sagt, jag kan till 99,99% garantera att det där scriptet håller för abuse.
Regards
Stefan/Pezzen
0

#16 Medlemmen är offline   CC HotRag 

  • Member
  • PipPipPip
  • Grupp: Members
  • Inlägg: 7
  • Gick med: 16-november 05

Postad 16 november 2005 - 17:32

Hej.
Frågar i denna tråd i stället för att skapa en ny.

Jag har ett kidnappat formulärmail.

Det som man kan fylla i via min sida, är bara avsändar-epost, ämne och meddelande.

Ändå så skapas en massa BCC (kopior) som spammar ned folk.

Jag såg ett script längre upp i tråden, men just BCC, hur stoppar man dem?
Och kan formmailet skickas till flera adresser, när man inte har med något fält att skriva i mottagaradress på? Har ju inte heller något fält för BCC.

Jag inser att det borde vara p.g.a. sidans namn med ordet *mail i, som gjort att det kidnappats och inte de två andra på min site, men skulle gärna vilja veta hur man stoppar masskickandet och inte bara skriva ett svårhittat filnamn.

/Emma CC
Fiffig signatur här!
0

#17 Medlemmen är offline   hasseman 

  • Advanced Member
  • PipPipPipPip
  • Grupp: Members
  • Inlägg: 11
  • Gick med: 18-januari 05

Postad 17 november 2005 - 03:09

Hej!

Jag har gjort ett eget mycket simpelt men fungerade script där besökaren kan skriva in namn och meddelande plus en massa andra saker som Skypenamn etc. Detta skickas sedan till min e-mail tillsammans med IP-adress och host. Om du vill kan du prova det här: http://www.hasseman.com/kontakt.php. Är det något du skulle vilja ha sen är det bara att säga till så mailar jag över koden.
0

Dela med dig av detta ämne:


Sida 1 av 1
  • Du kan inte skapa ett nytt ämne
  • Du kan inte svara i detta ämne


2 användare läser detta ämne
0 medlemmar, 2 gäster, 0 anonyma medlemmar