|
| Sikker kontakt-formular? Fra : Dennis Munding |
Dato : 12-09-06 11:47 |
|
Hej NG!
Jeg har virkelig brug for jeres ekspertise - har lige fået åbnet et domæne
efter suspendering - der blev sendt spam ud via min kontakt-formular!
Så mit spørgsmål/min bøn til jer er, om I vil kigge dette script igennem, og
fortælle mig, om det er sikkert nok iflg. jeres mening, eller om der er
ting, som kan gøres bedre, så jeg undgår samme situation igen...
Scriptet kan ses her:
http://www.pastebin.dk/index.php?show=2123
På forhånd tusind (endnu en gang) tak for hjælpen!
Med venlig hilsen
--
Dennis Munding
http://pe-vagtservice.dk/, http://cantica.dk/, http://munding-webdesign.dk/,
http://munding-interieur.dk/, http://skovaa-munding.dk/,
http://mundings-memorial.dk/, http://eds-denmark.dk/
| |
Morten Vadskær (12-09-2006)
| Kommentar Fra : Morten Vadskær |
Dato : 12-09-06 16:03 |
|
> Så mit spørgsmål/min bøn til jer er, om I vil kigge dette script igennem, og
> fortælle mig, om det er sikkert nok iflg. jeres mening, eller om der er
> ting, som kan gøres bedre, så jeg undgår samme situation igen...
Skal da prøve...
Nu ved vi jo ikke, hvordan din kontakt-formular ser ud, men går ikke ud
fra, at den indeholder andre felter end dem, du har nævnt i scriptet.
Du skriver i dine kommentarer, at du checker, at brugeren "kom fra
kontakt-siden". Det er en rigtig god idé, men det checker du rent
faktisk ikke. Du checker, at variablen $_POST['navn'] er udfyldt/tom. I
stedet bør du checke, at HTTP_REFERER indeholder adressen på din
kontakt-side, altså " http://www.dinside.dk/kontaktformular.php" eller
hvad den hedder. På den måde skal man spoofe sin HTTP_REFERER for at
lave XSS (som du sikkert var udsat for sidst).
Din variabel $modtager får ikke nogen værdi. Skal du ikke hente den med
$_POST eller noget? Går ud fra, at den fra kontaktformularen findes ud
fra en drop-down-menu.
Derudover (det er ikke noget sikkerhedsmæssigt), så kan jeg ikke se, at
variablen $att bliver tildelt nogen værdi, nogen steder, så måske vil du
også kigge på det.
Håber, det kan hjælpe lidt.
--
www.mXchange.dk - køb og sælg brugte mobiler
| |
Dennis Munding (12-09-2006)
| Kommentar Fra : Dennis Munding |
Dato : 12-09-06 18:37 |
|
Hej Morten!
"Morten Vadskær" <vadskaer@gmail.com> skrev i en meddelelse
news:4506cc3e$0$3474$edfadb0f@dread11.news.tele.dk...
> Skal da prøve...
> Nu ved vi jo ikke, hvordan din kontakt-formular ser ud, men går ikke ud
> fra, at den indeholder andre felter end dem, du har nævnt i scriptet.
Det gør den ikke...
> Du skriver i dine kommentarer, at du checker, at brugeren "kom fra
> kontakt-siden". Det er en rigtig god idé, men det checker du rent faktisk
> ikke. Du checker, at variablen $_POST['navn'] er udfyldt/tom. I stedet bør
> du checke, at HTTP_REFERER indeholder adressen på din kontakt-side, altså
> " http://www.dinside.dk/kontaktformular.php" eller hvad den hedder. På den
> måde skal man spoofe sin HTTP_REFERER for at lave XSS (som du sikkert var
> udsat for sidst).
Ok - men nu er jeg newbie, så du må gerne skære det ud i pap - hvordan skal
jeg helt specifikt skrive det i min nuværende kode?
Vil meget gerne undgå problemet igen (er ret besværligt, når mit domæne
bliver suspenderet p.g.a. spam, som jeg ikke sender/laver!).
> Din variabel $modtager får ikke nogen værdi. Skal du ikke hente den med
> $_POST eller noget? Går ud fra, at den fra kontaktformularen findes ud fra
> en drop-down-menu.
For at få det til at virke?
Nej det virker skam udemærket - jeg har testet med flere forskellige
email-adresser - det skal blot sørge for, at det er den rigtige modtager,
som får mailen, og det virker umiddelbart...
Du gætter rigtigt!
> Derudover (det er ikke noget sikkerhedsmæssigt), så kan jeg ikke se, at
> variablen $att bliver tildelt nogen værdi, nogen steder, så måske vil du
> også kigge på det.
Det har jeg også testet positivt - hvis ikke man finder den person, man vil
skrive til i drop-menuen, så kan man skrive i feltet "Attention" ($att), så
vil mailen blive sendt til standard-mailen, og derefter videre til rette
vedkommende i brevform.
> Håber, det kan hjælpe lidt.
Jo tak!
Men jeg tænkte også mere på, om jeg skal escape bruger-input ved alle felter
(add_slashes?)...??
Mange tak for svaret!
Med venlig hilsen
--
Dennis Munding
http://pe-vagtservice.dk/, http://cantica.dk/, http://munding-webdesign.dk/,
http://munding-interieur.dk/, http://skovaa-munding.dk/,
http://mundings-memorial.dk/, http://eds-denmark.dk/
| |
Morten Vadskær (12-09-2006)
| Kommentar Fra : Morten Vadskær |
Dato : 12-09-06 19:16 |
|
> Ok - men nu er jeg newbie, så du må gerne skære det ud i pap - hvordan skal
> jeg helt specifikt skrive det i min nuværende kode?
-Jo selvfølgelig. Der hvor du nu skriver:
if(!isset($_POST['navn']))
{
header("Location: kontakt.php"); //Hvis brugeren ikke kom fra
kontakt-siden, sender vi ham derhen
}
Skriver du i stedet:
if($_SERVER["HTTP_REFERER"] !=
" http://www.dinside.dk/dinkontaktformular.php")
{
header("Location: kontakt.php"); //Hvis brugeren ikke kom fra
kontakt-siden, sender vi ham derhen
}
> Men jeg tænkte også mere på, om jeg skal escape bruger-input ved alle felter
> (add_slashes?)...??
Tænkte det samme, men da du jo kun har email-adressen i din kode, så har
brugeren jo ikke mulighed for at ændre den. Er det ikke korrekt
forstået, at der står en email-adresse i de felter, hvor der står
"PERSON 1" - "PERSON 5" samt Webmasterens og Standard-mailen???
Morten
--
www.mXchange.dk - køb og sælg brugte mobiler
| |
Dennis Munding (12-09-2006)
| Kommentar Fra : Dennis Munding |
Dato : 12-09-06 19:25 |
|
Hej igen Morten!
"Morten Vadskær" <vadskaer@gmail.com> skrev i en meddelelse
news:4506f966$0$3523$edfadb0f@dread11.news.tele.dk...
> -Jo selvfølgelig. Der hvor du nu skriver:
>
> if(!isset($_POST['navn']))
> {
> header("Location: kontakt.php"); //Hvis brugeren ikke kom fra
> kontakt-siden, sender vi ham derhen
> }
>
> Skriver du i stedet:
> if($_SERVER["HTTP_REFERER"] !=
> " http://www.dinside.dk/dinkontaktformular.php")
> {
> header("Location: kontakt.php"); //Hvis brugeren ikke kom fra
> kontakt-siden, sender vi ham derhen
> }
Ok! (havde en mistanke om, at det var så simpelt, men jeg vil gerne være
*helt* sikker - sådan er jeg bare...).
> Tænkte det samme, men da du jo kun har email-adressen i din kode, så har
> brugeren jo ikke mulighed for at ændre den. Er det ikke korrekt forstået,
> at der står en email-adresse i de felter, hvor der står "PERSON 1" -
> "PERSON 5" samt Webmasterens og Standard-mailen???
Nemmere at sige, at $send indeholder en email...
Men jo - det er vist også det, du spørger om...
Men nu er det jo ikke kun email-adressen jeg henter fra kontakt-formularen -
der er jo både et navne-, emne- og tekst-felt, som man kan skrive i - og
dermed (så vidt jeg har forstået ud fra diverse debatter herinde) en
mulighed for injection...?!
Eller har jeg misforstået det?
Med venlig hilsen
--
Dennis Munding
http://pe-vagtservice.dk/, http://cantica.dk/, http://munding-webdesign.dk/,
http://munding-interieur.dk/, http://skovaa-munding.dk/,
http://mundings-memorial.dk/, http://eds-denmark.dk/
> Morten
>
> --
> www.mXchange.dk - køb og sælg brugte mobiler
| |
Morten Vadskær (12-09-2006)
| Kommentar Fra : Morten Vadskær |
Dato : 12-09-06 19:52 |
|
> Men nu er det jo ikke kun email-adressen jeg henter fra kontakt-formularen -
> der er jo både et navne-, emne- og tekst-felt, som man kan skrive i - og
> dermed (så vidt jeg har forstået ud fra diverse debatter herinde) en
> mulighed for injection...?!
>
> Eller har jeg misforstået det?
Nej - det er rigtigt nok. Det er altid en god idé at filtrere input. Du
kan jo lige køre den igennem en omgang addslashes()
Det gøres ved:
$navn = addslashes($_POST["navn"]);
etc. etc. med email, emne og tekst.
Så får du \" i stedet for ", hvis nu brugeren skulle være så fræk at
indtaste et ".
Kender ikke umiddelbart noget til danske sider med PHP-sikkerhed, så du
må holde dig til gruppen her.
--
www.mXchange.dk - køb og sælg brugte mobiler
| |
Dennis Munding (12-09-2006)
| Kommentar Fra : Dennis Munding |
Dato : 12-09-06 21:08 |
| | |
Morten Vadskær (13-09-2006)
| Kommentar Fra : Morten Vadskær |
Dato : 13-09-06 13:40 |
|
> Nu har jeg forsøgt mig med ovenstående, men det bevirker, at mailen ikke
> bliver sendt...??
>
> Og hvis jeg ændrer det til
> if(!$_SERVER["HTTP_REFERER"] =
> " http://www.dinside.dk/dinkontaktformular.php")....
>
> havner jeg bare på min fejlside for tomme felter... (hvis jeg skriver
> adressen til check-siden direkte i browseren)??
>
Ja, men altså, du skal jo ændre
" http://www.dinside.dk/dinkontaktformular.php" til den absolutte URL,
som din kontaktformular ligger på. Hvis den ligger på
http://dinside.dk/kontaktformular.html eller
http://dinside.dk/kontaktformular.php, så skal der stå dét. Det er jo
netop et sikkerhedscheck, så brugeren ikke kommer fra en lignende
formular på www.hackerkongens-hjemmeside.dk/fakeformular.php
For at finde ud af, hvad den hedder, kan du lave en
if($_SERVER["HTTP_REFERER"] !=
" http://www.dinside.dk/dinkontaktformular.php")
{
// header("Location: kontakt.php"); //Hvis brugeren ikke kom fra
kontakt-siden, sender vi ham derhen
echo "Du kom fra ".$_SERVER["HTTP_REFERER"];
}
Bemærk, det her er KUN for at finde ud af den absolutte sti fra din
kontaktformular. Bagefter skal du fjerne echo-linjen og // foran header.
Hjalp det?
--
www.mXchange.dk - køb og sælg brugte mobiler
| |
Dennis Munding (13-09-2006)
| Kommentar Fra : Dennis Munding |
Dato : 13-09-06 14:34 |
|
Hej Morten!
"Morten Vadskær" <vadskaer@gmail.com> skrev i en meddelelse
news:4507fc2b$0$3545$edfadb0f@dread11.news.tele.dk...
> Ja, men altså, du skal jo ændre
> " http://www.dinside.dk/dinkontaktformular.php" til den absolutte URL, som
> din kontaktformular ligger på. Hvis den ligger på
> http://dinside.dk/kontaktformular.html eller
> http://dinside.dk/kontaktformular.php, så skal der stå dét. Det er jo
> netop et sikkerhedscheck, så brugeren ikke kommer fra en lignende formular
> på www.hackerkongens-hjemmeside.dk/fakeformular.php
Ja, jeg burde selvfølgelig have skrevet, at jeg selvfølgelig har ændret
stien i dit eksempel til den eksakte sti til min kontakt-formular-side...
Men selv om jeg gør det, så ændrer det ikke på, at det ikke virker...
Med venlig hilsen
--
Dennis Munding
http://pe-vagtservice.dk/, http://cantica.dk/, http://munding-webdesign.dk/,
http://munding-interieur.dk/, http://skovaa-munding.dk/,
http://mundings-memorial.dk/, http://eds-denmark.dk/
| |
Morten Vadskær (13-09-2006)
| Kommentar Fra : Morten Vadskær |
Dato : 13-09-06 14:52 |
|
> Ja, jeg burde selvfølgelig have skrevet, at jeg selvfølgelig har ændret
> stien i dit eksempel til den eksakte sti til min kontakt-formular-side...
> Men selv om jeg gør det, så ændrer det ikke på, at det ikke virker...
He he. Dennis, er vi enige om, at hvis du har ændret stien, så
indeholder $_SERVER["HTTP_REFERER"] også den selvsamme værdi?
Det betyder, at den vil springe if-sætningen indeholdende
header("Location: kontaktformular.php"); over, ikke?
Derfor er der nok noget, der er galt. Hvad indeholder
$_SERVER["HTTP_REFERER"]? Har du prøvet at udkommentere header-linjen og
så få udskrevet, hvad HTTP_REFERER'ens værdi er?
--
www.mXchange.dk - køb og sælg brugte mobiler
| |
Dennis Munding (13-09-2006)
| Kommentar Fra : Dennis Munding |
Dato : 13-09-06 17:03 |
|
Hej Morten!
"Morten Vadskær" <vadskaer@gmail.com> skrev i en meddelelse
news:45080d04$0$3528$edfadb0f@dread11.news.tele.dk...
> He he. Dennis, er vi enige om, at hvis du har ændret stien, så indeholder
> $_SERVER["HTTP_REFERER"] også den selvsamme værdi?
Ja!
> Det betyder, at den vil springe if-sætningen indeholdende
> header("Location: kontaktformular.php"); over, ikke?
Normalt jo, men det gør den ikke...?
> Derfor er der nok noget, der er galt. Hvad indeholder
> $_SERVER["HTTP_REFERER"]? Har du prøvet at udkommentere header-linjen og
> så få udskrevet, hvad HTTP_REFERER'ens værdi er?
Det den skal - stien til den side, som indeholder kontakt-formularen (den
eksakte sti!).
A fatter aller en ski!
Med venlig hilsen
--
Dennis Munding
http://pe-vagtservice.dk/, http://cantica.dk/, http://munding-webdesign.dk/,
http://munding-interieur.dk/, http://skovaa-munding.dk/,
http://mundings-memorial.dk/, http://eds-denmark.dk/
| |
Morten Vadskær (13-09-2006)
| Kommentar Fra : Morten Vadskær |
Dato : 13-09-06 18:07 |
|
> A fatter aller en ski!
Dennis... Det er tid til at se patienten (=noget kode).
--
www.mXchange.dk - køb og sælg brugte mobiler
| |
Dennis Munding (13-09-2006)
| Kommentar Fra : Dennis Munding |
Dato : 13-09-06 20:21 |
| | |
Morten Vadskær (13-09-2006)
| Kommentar Fra : Morten Vadskær |
Dato : 13-09-06 21:20 |
|
Nåe - jamen det er jo slet ikke sikkert, at det er i den øverste
header("Location-sætning, det går galt. Det kunne f.eks. være her:
if(!empty($valid)) {
header("Location: kontakt.php");
}
Er du sikker på, det ikke er her? Da $valid jo indeholder
$_POST["testfelt"], er den jo ikke empty og derfor bliver brugeren sendt
videre til kontakt.php
Hjalp det?
--
www.mXchange.dk - køb og sælg brugte mobiler
| |
Dennis Munding (13-09-2006)
| Kommentar Fra : Dennis Munding |
Dato : 13-09-06 21:50 |
|
Hej Morten!
"Morten Vadskær" <vadskaer@gmail.com> skrev i en meddelelse
news:4508680e$0$3523$edfadb0f@dread11.news.tele.dk...
> Nåe - jamen det er jo slet ikke sikkert, at det er i den øverste
> header("Location-sætning, det går galt. Det kunne f.eks. være her:
>
> if(!empty($valid)) {
> header("Location: kontakt.php");
> }
>
> Er du sikker på, det ikke er her? Da $valid jo indeholder
> $_POST["testfelt"], er den jo ikke empty og derfor bliver brugeren sendt
> videre til kontakt.php
Det giver jo ikke mening (i hvert fald ikke for mig), da scriptet jo
fungerer udemærket bortset fra, når jeg bruger den linje, som du har
dikteret...
Når brugeren klikker på Send, så kommer han/hun - hvis ikke der er fejl i
formularen - videre til en præsentation af den afsendte formular.
Og det fungerer som sagt fint både med
if(!isset($_POST['navn'])) istedet for
if($_SERVER["HTTP_REFERER"] !=
" http://www.MIT-DOMÆNE.dk/NØJAGTIG-STI-TIL-kontakt.php")
og med
if(!empty($valid)) {
header("Location: kontakt.php");
} --> som blot tjekker, at der ikke er skrevet noget i feltet "testfelt"
(spam-sikring).
Så jeg vil nærmere men, at det måske er denne linje, som der er noget galt
med:
if($_SERVER["HTTP_REFERER"] !=
" http://www.MIT-DOMÆNE.dk/NØJAGTIG-STI-TIL-kontakt.php")
Med hvad det skulle være, ved jeg ikke...
Måske gåseøjnene eller manglende parentes (har jeg dog forsøgt mig med uden
held...)
Med venlig hilsen
--
Dennis Munding
http://pe-vagtservice.dk/, http://cantica.dk/, http://munding-webdesign.dk/,
http://munding-interieur.dk/, http://skovaa-munding.dk/,
http://mundings-memorial.dk/, http://eds-denmark.dk/
| |
Morten Vadskær (14-09-2006)
| Kommentar Fra : Morten Vadskær |
Dato : 14-09-06 12:23 |
|
> Det giver jo ikke mening (i hvert fald ikke for mig), da scriptet jo
> fungerer udemærket bortset fra, når jeg bruger den linje, som du har
> dikteret...
Nej, det kan du selvfølgelig have ret i. Men kan du ikke lige skrive det
her i stedet så:
if ($_SERVER["HTTP_REFERER"] !=
" http://nøjagtigsti.dk/tilkontaktformular.php") {
echo $_SERVER["HTTP_REFERER"];
exit;
}
og så fortælle os, hvad der står deri? Samt sætte den ind i gåseøjnene.
Det er ikke fordi du sidder og tester på en lokal maskine og har den
absolutte adresse på din rigtige side, vel?
--
www.mXchange.dk - køb og sælg brugte mobiler
| |
Dennis Munding (14-09-2006)
| Kommentar Fra : Dennis Munding |
Dato : 14-09-06 13:38 |
|
Hej Morten!
"Morten Vadskær" <vadskaer@gmail.com> skrev i en meddelelse
news:45093b9f$0$3457$edfadb0f@dread11.news.tele.dk...
> Nej, det kan du selvfølgelig have ret i. Men kan du ikke lige skrive det
> her i stedet så:
> if ($_SERVER["HTTP_REFERER"] !=
> " http://nøjagtigsti.dk/tilkontaktformular.php") {
> echo $_SERVER["HTTP_REFERER"];
> exit;
> }
> og så fortælle os, hvad der står deri? Samt sætte den ind i gåseøjnene.
> Det er ikke fordi du sidder og tester på en lokal maskine og har den
> absolutte adresse på din rigtige side, vel?
Jo, men det har jeg allerede svaret på en gang før - den udskriver den
nøjagtige (korrekte) sti (som jeg har angivet i den linje du har postet) til
min kontakt-formular.
Helt eksakt ser min version af linjen således ud:
if ($_SERVER["HTTP_REFERER"] !=
" http://www.munding-webdesign.dk/Kontakt/kontakt.php") {
header("Location: kontakt.php");
}
Nej jeg tester ikke lokalt - uploader skam "skidtet" og tester det online -
godt nok er jeg newbie, men jeg er ikke helt idiot - endnu...
Med venlig hilsen
--
Dennis Munding
http://pe-vagtservice.dk/, http://cantica.dk/, http://munding-webdesign.dk/,
http://munding-interieur.dk/, http://skovaa-munding.dk/,
http://mundings-memorial.dk/, http://eds-denmark.dk/
| |
Morten Vadskær (14-09-2006)
| Kommentar Fra : Morten Vadskær |
Dato : 14-09-06 16:18 |
|
> Jo, men det har jeg allerede svaret på en gang før - den udskriver den
> nøjagtige (korrekte) sti (som jeg har angivet i den linje du har postet) til
> min kontakt-formular.
Forstår godt, du synes, jeg er tosset. Men nu har jeg testet den kode,
jeg har givet dig, og det virker helt efter hensigten hos mig.
Prøv nu at udkommentere begge dine header-linjer. Og nedenunder dem skrive:
echo "Dette er den første headerlinje";
og "anden" i den næste.
Så får du jo set, hvor det er, du bliver sendt videre fra.
> if ($_SERVER["HTTP_REFERER"] !=
> " http://www.munding-webdesign.dk/Kontakt/kontakt.php") {
> header("Location: kontakt.php");
> }
Ja, det ser jo rigtigt nok ud.
> Nej jeg tester ikke lokalt - uploader skam "skidtet" og tester det online -
> godt nok er jeg newbie, men jeg er ikke helt idiot - endnu...
Man ved jo aldrig. Havde mistanken længe, men tænkte, at dét ville jeg
ikke spørge dig om. Men det kunne jo være....
--
www.mXchange.dk - køb og sælg brugte mobiler
| |
Dennis Munding (14-09-2006)
| Kommentar Fra : Dennis Munding |
Dato : 14-09-06 21:22 |
|
Hej Morten!
"Morten Vadskær" <vadskaer@gmail.com> skrev i en meddelelse
news:450972bb$0$3473$edfadb0f@dread11.news.tele.dk...
> Forstår godt, du synes, jeg er tosset. Men nu har jeg testet den kode, jeg
> har givet dig, og det virker helt efter hensigten hos mig.
Har jeg skam aldrig påstået endsige tænkt...
Stædig ja, men ikke tosset...
> Prøv nu at udkommentere begge dine header-linjer. Og nedenunder dem
> skrive:
> echo "Dette er den første headerlinje";
> og "anden" i den næste.
Det er hermed gjort...
(Jeg lader den være sådan indtil imorgen eftermiddag - næppe nogen, som vil
kontakte mig på dette tidspunkt af døgnet...)
> Så får du jo set, hvor det er, du bliver sendt videre fra.
Citat "Dette er første header!" |
> Ja, det ser jo rigtigt nok ud.
Regnede jeg skam også med...
> Man ved jo aldrig. Havde mistanken længe, men tænkte, at dét ville jeg
> ikke spørge dig om. Men det kunne jo være....
Kan godt se, at hvis du kan få det til at virke, så er det mystisk, at jeg
ikke kan...
PS: Har modtaget din besked fra formularen - men jeg havde også
udkommenteret den omstridte linje, og sat den gamle ind istedet...
Med venlig hilsen
--
Dennis Munding
http://pe-vagtservice.dk/, http://cantica.dk/, http://munding-webdesign.dk/,
http://munding-interieur.dk/, http://skovaa-munding.dk/,
http://mundings-memorial.dk/, http://eds-denmark.dk/
| |
Morten Vadskær (12-09-2006)
| Kommentar Fra : Morten Vadskær |
Dato : 12-09-06 16:20 |
| | |
Dennis Munding (12-09-2006)
| Kommentar Fra : Dennis Munding |
Dato : 12-09-06 18:39 |
|
Hej igen Morten!
"Morten Vadskær" <vadskaer@gmail.com> skrev i en meddelelse
news:4506d003$0$3467$edfadb0f@dread11.news.tele.dk...
> Hov, glemte lige at tilføje, at vil du læse mere, kan du starte på:
> http://www.phpsec.org
Jeg har det desværre ikke så godt med sider på engelsk, når jeg skal blive
klog på noget kode - det bliver for tung for mig at forstå, da mit engelske
ikke rækker så langt...
Men tak alligevel.
> Og bogen PHP Security er også udmærket
> http://www.phpsecurity.org
Findes der ikke et alternativ på dansk??
For den ser meget interesant ud!
Med venlig hilsen
--
Dennis Munding
http://pe-vagtservice.dk/, http://cantica.dk/, http://munding-webdesign.dk/,
http://munding-interieur.dk/, http://skovaa-munding.dk/,
http://mundings-memorial.dk/, http://eds-denmark.dk/
| |
|
|