Lek mail-script weer veilg maken?
Kan iemand mij uitleggen waarom dat is en hoe ik dat moet aanpassen. Mochten de aanpassingen te veel zijn houd ik me aanbevolen voor een goed en veilig alternatief.
Hier de code
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?
//pas de onderstaande variabelen aan naar jouw wensen
$adminaddress = "xx@xx,nk";
$siteaddress ="http://www.xxx.nl";
$sitename = "XXX";
//hieronder hoeft in principe niets ge-edit te worden...
// Haalt de tijd en de datum van de server
$date = date("d/m/Y H:i:s");
// Haalt de informatie dat gepost is door Flash
$action = $HTTP_POST_VARS['action'] ;
$email = $HTTP_POST_VARS['email'] ;
$naam = $HTTP_POST_VARS['naam'] ;
$bericht = $HTTP_POST_VARS['comments'] ;
//De informatie uit de tekstbalken (de variabelen) wordt gestructureerd naar jouw email adres gestuurd.
if ($action == "send") {
//hieronder kan de tekst worden aangepast
//een harde enter wordt weergegeven als /n
//alles na een $-teken is een variabele
mail ("$adminaddress","Bericht van $siteaddress",
"Een bezoeker van $sitename heeft het volgende bericht achtergelaten\n
Naam: $naam
Email: $email
______________________________
$bericht
______________________________
Date/Time: $date","FROM:$adminaddress" ) ;
//De verzender van de email krijgt automatisch een bedankje
//deze tekst is ook aan te passen.
mail ("$email","Dank U voor het bezoeken van $sitename",
"Geachte $naam,\n
Dank u voor uw interesse in $sitename.\n
Uw mail wordt zo snel mogelijk in behandeling genomen.\n
Met Vriendelijke Groet,\n
t \n
$siteaddress","FROM:$adminaddress"
) ;
//Deze bevestiging wordt naar Flash gestuurd als alles is afgerond.
$sendresult = "Dank u wel. U ontvangt binnen enkele seconden een bevestigingsmail.";
$send_answer = "answer=";
$send_answer .= rawurlencode($sendresult);
echo $send_answer;
}
?>
//pas de onderstaande variabelen aan naar jouw wensen
$adminaddress = "xx@xx,nk";
$siteaddress ="http://www.xxx.nl";
$sitename = "XXX";
//hieronder hoeft in principe niets ge-edit te worden...
// Haalt de tijd en de datum van de server
$date = date("d/m/Y H:i:s");
// Haalt de informatie dat gepost is door Flash
$action = $HTTP_POST_VARS['action'] ;
$email = $HTTP_POST_VARS['email'] ;
$naam = $HTTP_POST_VARS['naam'] ;
$bericht = $HTTP_POST_VARS['comments'] ;
//De informatie uit de tekstbalken (de variabelen) wordt gestructureerd naar jouw email adres gestuurd.
if ($action == "send") {
//hieronder kan de tekst worden aangepast
//een harde enter wordt weergegeven als /n
//alles na een $-teken is een variabele
mail ("$adminaddress","Bericht van $siteaddress",
"Een bezoeker van $sitename heeft het volgende bericht achtergelaten\n
Naam: $naam
Email: $email
______________________________
$bericht
______________________________
Date/Time: $date","FROM:$adminaddress" ) ;
//De verzender van de email krijgt automatisch een bedankje
//deze tekst is ook aan te passen.
mail ("$email","Dank U voor het bezoeken van $sitename",
"Geachte $naam,\n
Dank u voor uw interesse in $sitename.\n
Uw mail wordt zo snel mogelijk in behandeling genomen.\n
Met Vriendelijke Groet,\n
t \n
$siteaddress","FROM:$adminaddress"
) ;
//Deze bevestiging wordt naar Flash gestuurd als alles is afgerond.
$sendresult = "Dank u wel. U ontvangt binnen enkele seconden een bevestigingsmail.";
$send_answer = "answer=";
$send_answer .= rawurlencode($sendresult);
echo $send_answer;
}
?>
Gewijzigd op 10/05/2013 12:54:30 door MArk Peters
Als ik pagina.php met $_POST['action'] = 'send' open kan ik dus op jouw naam naar elk emailadres een mail laten sturen.
Je kan nog net niet het bericht doorgeven, want dan had het helemaal mooi geweest.
Bouw een captcha in. Dat voorkomt spamming.
Frank Nietbelangrijk op 10/05/2013 13:11:30:
Bouw een captcha in. Dat voorkomt spamming.
Captcha voorkomt spamming, maar niet het probleem dat het script onveilig is.
Controleer of er daadwerkelijk ook wel een formulier is verzonden met $_SERVER['REQUEST_METHOD'] == 'POST' dit maakt je code direct al een stuk veiliger. Daarnaast kan je die HTTP_POST_VARS ook vervangen door $_POST zoals Eddy al vermeld.
http://phpwiki.santhe.nl/index.php?title=Check_het_emailadres_op_juistheid
http://phpwiki.santhe.nl/index.php?title=De_juiste_mailheaders
http://nl1.php.net/manual/en/function.htmlentities.php
http://phpwiki.santhe.nl/index.php?title=De_juiste_mailheaders
http://nl1.php.net/manual/en/function.htmlentities.php
er is hier niets onveilig, behalve dat je server overbelast kan raken door spamming.
Zelfs $_SERVER['REQUEST_METHOD'] == 'POST' maakt je script 0,0% veiliger, dit controleert alleen maar of de request een post of een get is!
Frank
Excuses,
Gewijzigd op 10/05/2013 13:54:31 door Frank Nietbelangrijk
Pas echt ernstig wordt het, als bij het From adres ook het adres vanuit de POST data zou komen. Dan kan iemand het hele mailtje overnemen, incl ontvangers EN de inhoud
Mmm oke stukje duidelijker. Als ik dus $_POST gebruik icm $_SERVER['REQUEST_METHOD'] == 'POST' kan ik dit scriptje dan (redelijk) veilig gebruiken of zijn er veiliger scripts?
- SanThe - op 10/05/2013 13:29:49:
Even de titels onder elkaar, wat gelijk de tips zijn:
- controleer het emailadres op juistheid (dat het er maar 1 is etc)
- geef de juiste mailheaders weer, zoals een FROM
- gebruik htmlentities() om eventuele zaken tegen te houden.
Daarnaast:
- laat het script per gebruiker/ip niet meer dan 1 mail per minuut versturen (dmv session/cookie)
- controleer of het vorige mailtje niet exact hetzelfde is (zo wel: beetje nutteloos dus)
- Controleer of alles goed is ingevuld voordat je wat gaat doen.
Dan is het veilig, wat Frank zegt klopt niet helemaal jij controleer nu namelijk niet of er een formulier op JOUW server is ingevuld. Met $_SERVER['REQUEST_METHOD'] doe je dat wel, zo weet je bijna 99,9% dat het formulier van jouw website afkomt.
Daarnaast kan je nog een captcha maken, alleen ik ken al BOTS die dit kunnen aflezen (door een heel libary aan images en die met elkaar vergelijken). Wat je kan toepassen is een hidden input maken, en vervolgens controleren of die is ingevuld of niet (tip van SanThe volgens mij). Aangezien de meeste spam-bots alles invullen bij formulieren, ook hidden inputs voorkom je ook direct spam :)
Daarnaast kan je de tips, van Eddy, en SanThe gebruiken om het nog veiliger te maken.
Gewijzigd op 10/05/2013 19:37:59 door Landleven Tips
Wat ik aanraad is het volgende.
- Filter_var gebruiken om het e-mailadres veld te controleren. Zo kan er maar één e-mailadres mee verstuurd worden en moet het ook een echt e-mailadres zijn.
- Naam en content ook valideren op bijvoorbeeld lengte etc.
- Eventueel een captcha als het niet stopt.
Misschien is het ook aan te raden om SWIFT mailer of PHP Mailer te gebruiken. Dan ben je zeker dat je de juiste headers en dergelijke hebt. Daarnaast heeft SWIFT mailer ook heel wat handige classes enzovoort.
@Eddy
Daarvoor moet je een database gebruiken en geen sessies en cookies! Gewoon eens je browser sluiten en voilà. Sessies en cookies zijn verdwenen (als men een bot gebruikt gebeurt dit natuurlijk automatisch).
Maar zelfs met een database is het niet waterdicht omdat sommige spammers misschien iedere keer van IP veranderen (spoofen). Dan is een captcha een mogelijke oplossing.
Maar filteren op enkel IP is ook waardeloos, dat is zo verwisseld (goed, cookies en sessies ook).