WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Något är fel med vad? (https://www.wn.se/forum/showthread.php?t=30535)

Davve 2008-07-14 15:15

Hej, försöker fixa en enkel kontaktformulär men får inte till det riktigt, vad är det som rä fel i koden, för jag får fram att det inte gick att skicka...

Kod:

<?php

$to = "[email protected]";
$from = $_POST["email"];
$name = $_POST["name"];
$persnr = $_POST["persnr"];
$tel = $_POST["tel"];
$adress = $_POST["adress"];
$postnr = $_POST["postnr"];
$ort = $_POST["ort"];
$bild = $_POST["bild"];
$format = $_POST["format"];
$antal = $_POST["antal"];
$message = $_POST["message"];
$agree = $_POST["agree"];

if (mail($to, $message, $persnr, $adress, $postnr, $ort, $from, $tel, $bild, $antal, $format, $agree ,"From: $name <$from>"))

echo nl2br("<h2>Din beställning har nu skickats till oss! Kompian på beställningen ser du nedan, är det något som inte stämmer, kontakta oss snarast!</h2>
<b>Mottagare:</b> $to<br><br>
<b>Presonnummer:</b> $persnr
<b>Namn:</b> $name
<b>Adress:</b> $adress
<b>Postnummer:</b> $postnr
<b>Ort:</b> $ort
<b>Epost:</b> $email
<b>Telefon:</b> $tel
<b>Bild:</b> $bild
<b>Antal:</b> $antal
<b>Format:</b> $format
<b>Meddelande:</b> $message
<b>Godkänd:</b> $agree
");

else
echo "Det gick inte att skicka ditt meddelande";

?>

Tacksam för hjälp då jag kommer inte längre här :)

victor- 2008-07-14 15:22

Du måste skapa ett mail av alla variabler du har, typ:
"Namn: ".$namn."\nPersonnummer: ".$persnr."\n" osv..

http://www.php.net/manual/en/function.mail.php

Davve 2008-07-14 15:25

ok, verkar rätt svårt det där

eliasson 2008-07-14 15:37

mail(To, Subject, Body, Headers);

Davve 2008-07-14 16:05

Lite väl överkurs för mig :) PHP kan jag inte tyvärr så det blir svårt att lösa det, det är ingen som har lust att skriva hur det skall vara?

Jonathan P 2008-07-14 16:45

Ändra följande...
Kod:

if (mail($to, $message, $persnr, $adress, $postnr, $ort, $from, $tel, $bild, $antal, $format, $agree ,"From: $name <$from>"))
...till...
Kod:

if (mail($to, "From: $name <$from>", "$message, $persnr, $adress, $postnr, $ort, $from, $tel, $bild, $antal, $format, $agree"))

Davve 2008-07-14 16:50

Tack Jonathan ;) verkar funka :) Hur gör man så att det blir radbrytning i mailet sedan då efter varje variabel?

nu är allt i samma linje

grazzy 2008-07-14 17:05

Detta är lite som att lära nån ladda ett gevär så de kan skjuta sig själva.

Guldstjärna i kanten till den som hittar de tolv säkerhetshålen i Davves kod.

etanders 2008-07-14 17:09

Snabbt svar: Ändra till följande så får du radbrytningar
Kod:

if (mail($to, "From: $name <$from>", "$message\n$persnr\n$adress\n$postnr\n$ort\n$from\n$tel\n$bild\n$antal\n$format\n$agree"))
(Lägg till flera \n om du vill ha fler radbrytningar.)

...men som grazzy antyder finns det en del annat du borde lägga till för att göra koden säkrare...

Davve 2008-07-14 17:40

Tack, nu börjar det likna nåt, det som inte fungerar än är headers. När mailet kommer så är det rätta "till" där min adress står, under ämne på mailet står det "From mail" och där from mail ska vara är det loopias www.mail istället för mail från den personen som skickar brevet.

if (mail($to, "From: $name <$from>", "$persnr\n$name\n$adress\n$postnr\n$ort\n$from\n$t el\n$bild\n$antal\n$format\n\n$message\n\n$agree") )

vart ska subject in för att det ska vara rätt?

ztream 2008-07-14 17:44

www.php.net/mail

Magnus_A 2008-07-14 20:56

PHPMailer, fast det blir nog för svårt. Fixat säkerhetshålen ännu?

tartareandesire 2008-07-14 21:24

Citat:

Originally posted by eliasson@Jul 14 2008, 15:37
mail(To, Subject, Body, Headers);

Det som gäller enligt eliassons exempel är:

To: adressen dit mailet ska skickas
Subject: Titel / rubrik för mailet
Body: Meddelandet (har du en massa variabler enligt ditt exempel så måste du sätta ihop allt till en variabel som innehåller HELA meddelandet)
Headers: från-adress, teckenkodning etc. (se beskrivning av mail-funktionen i länk ovan)

Som flera redan påpekat så kan vem som helst i nuläget använda ditt kontaktformulär för att skicka spam till hela världen om de så önskar, med de begränsningar eventuellt webbhotell har.

victor- 2008-07-15 00:48

Citat:

Originally posted by Jonathan P@Jul 14 2008, 16:45
Ändra följande...
Kod:

if (mail($to, $message, $persnr, $adress, $postnr, $ort, $from, $tel, $bild, $antal, $format, $agree ,"From: $name <$from>"))
...till...
Kod:

if (mail($to, "From: $name <$from>", "$message, $persnr, $adress, $postnr, $ort, $from, $tel, $bild, $antal, $format, $agree"))

Ändra följande...
Kod:

if (mail($to, "From: $name <$from>", "$message, $persnr, $adress, $postnr, $ort, $from, $tel, $bild, $antal, $format, $agree"))
...till...
Kod:

if (mail($to, "HEJSAN!!!!!11 från $name <$from>", "$message, $persnr, $adress, $postnr, $ort, $from, $tel, $bild, $antal, $format, $agree"), "From: En Apa i Pyjamas!")

Davve 2008-07-15 04:52

Tack för alla svar, nu fungerar det korrekt. Ni som påpekar säkerhetshålen skulle tillföra så mycket mer genom att komma med exempel på hur man löser det istället för att förlöjliga det. några av oss även här haft annat för sig i sin uppväxt än att sitta 20 timmar framför burken varje dag :)=

EmilIsberg 2008-07-15 10:52

Det jag skulle göra är att skriva skriptet på ett något annat sätt.

Kod:

<?php

// http://www.phpit.net/code/valid-email/
function valid_email($email) {
 // First, we check that there's one @ symbol, and that the lengths are right
 if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
  // Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
  return false;
 }
 // Split it into sections to make life easier
 $email_array = explode("@", $email);
 $local_array = explode(".", $email_array[0]);
 for ($i = 0; $i < sizeof($local_array); $i++) {
  if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\|\")]{0,62}\"))$", $local_array[$i])) {
  return false;
  }
 }
 if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
  $domain_array = explode(".", $email_array[1]);
  if (sizeof($domain_array) < 2) {
    return false; // Not enough parts to domain
  }
  for ($i = 0; $i < sizeof($domain_array); $i++) {
  if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) {
    return false;
  }
  }
 }
 return true;
}

// liten egen hjälpfunktion
function pvar($var)
{
 $got = $_POST[$var];
 // jag använder htmlentities som man kan läsa om på http://se2.php.net/htmlentities
 $got = htmlentities($got);

 // alternativt borde man kunna använda något av följande
 // http://se.php.net/manual/en/function.strip-tags.php
 // http://se.php.net/manual/en/function.htmlspecialchars-decode.php
 // http://se.php.net/manual/en/function.addslashes.php
 return $got;
}

$to = "[email protected]";
$subj = "Hemsidesinfo";
$from = pvar("email");
$fname = pvar("name");
$msg = "<b>Personnummer:</b> ". pvar("persnr")."\n".
"<b>Namn:</b> ". pvar("name")."\n".
"<b>Adress:</b> ". pvar("adress")."\n".
"<b>Postnummer:</b> ". pvar("postnr")."\n".
"<b>Ort:</b> ". pvar("ort")."\n".
"<b>Epost:</b> ". pvar("email")."\n".
"<b>Telefon:</b> ". pvar("tel")."\n".
"<b>Bild:</b> ". pvar("bild")."\n".
"<b>Antal:</b> ". pvar("antal")."\n".
"<b>Format:</b> ". pvar("format")."\n".
"<b>Meddelande:</b> ". pvar("message")."\n".
"<b>Godkänd:</b> ". pvar("agree")."\n".
"\n";

if (!valid_email($from))
 echo "<h2>Felaktigt formulärdata.</h2>Kontrollera att uppgifterna är korrekt ifyllda.";
elseif (mail($to, $subj, wordwrap(strip_tags($msg),70), "From: \"$fname\" <$from>")
 echo nl2br("<h2>Din beställning har nu skickats till oss! Kopian på beställningen ser du nedan, är det något som inte stämmer, kontakta oss snarast!</h2>\n\n$msg");
else
 echo "<h2>Det gick inte att skicka ditt meddelande.</h2> Var god försök senare.";

?>

Jag gjorde följande:
  • "Presonnummer" och "Kompian"
  • Visa samma sak som skickas (bra rekommendation generellt och minskar missförstånd vid felsökning)
  • Få överskådliga variabler
  • Undvik att skriva ut e-postadressen meddelandet skickas till (onödigt för besökaren som skickat formuläret plus att det kan användas för skräppost)
  • Undvik att upprepa kod (enklare att ändra och lägga till om man använder egna hjälpfunktioner)
  • Försök att validera att man faktiskt får något som liknar en e-postadress.
  • Undvik att "lita" på det kunden skickar. (http://blogg.loopia.se/?p=68)
  • Använd example.org (testdomän) istället för adress.se (ägs av PMG Media Group AB)
  • Ange en ärenderad som är specifik för just detta formulär (gör det enklare att särskilja från annan e-post och formulär)
  • Radbryt om rader överstiger 70 tecken (http://se.php.net/manual/en/function.wordwrap.php)

Om du använder dig av UNIX-server hos oss eller någon annan bör du dessutom lägga till ett fjärde fält till mail()-funktionen:
Kod:

elseif (mail($to, $subj, strip_tags($msg), "From: \"$fname\" <$from>","-f$from")
Notera dock att jag inte på något sätt har testat ovanstående skript och att inget ansvar tas för eventuella fel i skriptet.

tartareandesire 2008-07-15 12:24

Citat:

Originally posted by Davve@Jul 15 2008, 04:52
Tack för alla svar, nu fungerar det korrekt. Ni som påpekar säkerhetshålen skulle tillföra så mycket mer genom att komma med exempel på hur man löser det istället för att förlöjliga det. några av oss även här haft annat för sig i sin uppväxt än att sitta 20 timmar framför burken varje dag =

Om det är någon som förlöjligar någon så är det du nu.... Jag satt inte mycket vid datorn alls under min uppväxt om det nu har någon betydelse.

Till Emils kod kan tilläggas att teckenkodning bör skickas med till htmlentities om man inte använder ISO-8859-1 (förslagsvis UTF-8). Htmlentities är inte helt nödvändig dock utan det går som han antyder att lösa på andra sätt.

För övrigt så säger väl ztream det nedan som flera hintat om på mindre väl valda sätt.

ztream 2008-07-15 12:27

Poängen som många gör är nog att oavsett hur lat man är, så borde man läsa manualen innan man ber professionella webmasters lösa ens problem gratis.

Citat:

Originally posted by Davve@Jul 15 2008, 04:52
Tack för alla svar, nu fungerar det korrekt. Ni som påpekar säkerhetshålen skulle tillföra så mycket mer genom att komma med exempel på hur man löser det istället för att förlöjliga det. några av oss även här haft annat för sig i sin uppväxt än att sitta 20 timmar framför burken varje dag =


digi 2008-07-15 12:29

Citat:

Originally posted by Davve@Jul 15 2008, 04:52
Tack för alla svar, nu fungerar det korrekt. Ni som påpekar säkerhetshålen skulle tillföra så mycket mer genom att komma med exempel på hur man löser det istället för att förlöjliga det. några av oss även här haft annat för sig i sin uppväxt än att sitta 20 timmar framför burken varje dag
Tror du inte folk tappar lusten att hjälpa dig när du uttrycker dig sådär?
Även om det inte var illa menat så låter det inte vidare trevligt, hade jag kunnat PHP hade jag nog gjort allt annat än hjälpt dig nu.

edit: typo

FredrikNas 2008-07-15 13:08

Førvisso håller jag med dig davve i att vill man ge kritik kan det ju också høra till god sed att åtminstone ge dig ett tips om hur du går vidare (annars ær man væl bara elak? ;)), (jag tycker absolut inte, under några omstændigheter att folk ska ge dig kod, det lær du dig ingenting av.) Hur har du tænkt kunna koda i php om du inte kan php (och inte tycks villig att læra dig? måste jag också fråga mig? du kan ju inte mena att du ska førlita dig på att andra skriver koden gratis åt dig før att du frågar på wn.se? Vill du jobba i php så finns det vældigt många bra bøcker att læsa jag kan rekomedera dig flera stycken som skulle passa och ge dig en basic insættning i php, som du behøver før att skriva ett mailformulær.

Sen kommentarer om hur mycket folk hær inne har spenderat framfør datorn i barndomsdagar ær ju oerhørt onødigt, speciellt då du vænder dig till dessa personer før hjælp? Vem tror du vill hjælpa dig næsta gång ?

Edit: Type-o

tartareandesire 2008-07-15 13:55

Nu är det visserligen så att du (Davve) inte är programmerare och inte vill lära dig PHP utan och innan men ska du ändå kunna fixa till sådana här saker så måste du åtminstone lära dig grunderna, t.ex. vad variabler är och hur de fungerar. Googla efter "mail injection" för att läsa mer om just detta problemet.


Alla tider är GMT +2. Klockan är nu 23:10.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson