Bekijk Volledige Versie : [PHP] mail functie veilig?
Arjen Haayman
05/10/04, 07:25
Hallo,
Is het nodig om de invoer voor PHP's mail() functie te controleren op
onveilige code of doet de mail-functie dat voor je?
Arjen Haayman
Arjen Haayman
05/10/04, 21:55
Arjen Haayman wrote:
> Hallo,
>
> Is het nodig om de invoer voor PHP's mail() functie te controleren op
> onveilige code of doet de mail-functie dat voor je?
hmm, misschien is m'n vraag niet duidelijk genoeg.
Is deze code veilig?
$naam = $_REQUEST[ 'naam'];
$email = $_REQUEST[ 'email'];
$onderwerp = $_REQUEST[ 'onderwerp'];
$bericht = $_REQUEST[ 'bericht'];
function send_mail()
{
global $naam, $onderwerp, $email, $bericht;
mail( "ik@mijndomein.nl",
"[vraag] $onderwerp",
$bericht,
"From: $naam <$email>\n");
}
--
Arjen Haayman
-- cogito ergo bicyclo --
Branko Collin
05/10/04, 22:15
Arjen Haayman <ahaayman@deadspam.com>, you wrote on Tue, 05 Oct 2004
21:48:40 +0200:
>Arjen Haayman wrote:
>> Hallo,
>>
>> Is het nodig om de invoer voor PHP's mail() functie te controleren op
>> onveilige code of doet de mail-functie dat voor je?
>hmm, misschien is m'n vraag niet duidelijk genoeg.
>Is deze code veilig?
>
>$naam = $_REQUEST[ 'naam'];
>$email = $_REQUEST[ 'email'];
>$onderwerp = $_REQUEST[ 'onderwerp'];
>$bericht = $_REQUEST[ 'bericht'];
>
>function send_mail()
>{
> global $naam, $onderwerp, $email, $bericht;
> mail( "ik@mijndomein.nl",
> "[vraag] $onderwerp",
> $bericht,
> "From: $naam <$email>\n");
>}
Tenzij anders vermeld in de handleiding, zou ik er nooit vanuit gaan
dat een PHP-functie 'veilig' is. In dit geval zou ik dus zeker de
$_REQUEST-waarden controleren.
--
Wel zie ik het betere en prijs het;
toch jaag ik het slechtere na
Matthijs de Z
05/10/04, 22:15
> > Is het nodig om de invoer voor PHP's mail() functie te controleren op
> > onveilige code of doet de mail-functie dat voor je?
> hmm, misschien is m'n vraag niet duidelijk genoeg.
> Is deze code veilig?
> $naam = $_REQUEST[ 'naam'];
> $email = $_REQUEST[ 'email'];
> $onderwerp = $_REQUEST[ 'onderwerp'];
> $bericht = $_REQUEST[ 'bericht'];
>
> function send_mail()
> {
> global $naam, $onderwerp, $email, $bericht;
> mail( "ik@mijndomein.nl",
> "[vraag] $onderwerp",
> $bericht,
> "From: $naam <$email>\n");
> }
Naast de vele opmerkingen die je waarschijnlijk zal krijgen en die veel
zinniger zullen zijn dan die van mij...ik zou er ook even een referrer check
in bouwen. Anders kan iedereen mailen via dat script. Dus iets als:
if($waar_kom_je_vandaan != mijn_eigen_server_)
{
hoepel op
}
else
{
mail versturen
}
Mazzel,
Matthijs
>
> --
> Arjen Haayman
> -- cogito ergo bicyclo --
Op Tue, 05 Oct 2004 22:12:38 +0200, schreef Branko Collin:
> Tenzij anders vermeld in de handleiding, zou ik er nooit vanuit gaan
> dat een PHP-functie 'veilig' is. In dit geval zou ik dus zeker de
> $_REQUEST-waarden controleren.
Inderdaad, in dit geval zeker omdat het requestwaarden zijn, maar als je
die maar controleert dan lijkt me de aanroep van de functie beslist wel
veilig.
Branko Collin
05/10/04, 22:35
Branko Collin <collin@xs4all.nl>, you wrote on Tue, 05 Oct 2004
22:12:38 +0200:
>Tenzij anders vermeld in de handleiding, zou ik er nooit vanuit gaan
>dat een PHP-functie 'veilig' is.
Euh, dat moet natuurlijk "Tenzij vermeld" zijn. :-\
--
Wel zie ik het betere en prijs het;
toch jaag ik het slechtere na
Arjen Haayman
05/10/04, 23:25
Matthijs de Z wrote:
>>>Is het nodig om de invoer voor PHP's mail() functie te controleren op
>>>onveilige code of doet de mail-functie dat voor je?
>>
>>hmm, misschien is m'n vraag niet duidelijk genoeg.
>>Is deze code veilig?
>
>
>
>>$naam = $_REQUEST[ 'naam'];
>>$email = $_REQUEST[ 'email'];
>>$onderwerp = $_REQUEST[ 'onderwerp'];
>>$bericht = $_REQUEST[ 'bericht'];
>>
>>function send_mail()
>>{
>>global $naam, $onderwerp, $email, $bericht;
>>mail( "ik@mijndomein.nl",
>>"[vraag] $onderwerp",
>>$bericht,
>>"From: $naam <$email>\n");
>>}
>
>
> Naast de vele opmerkingen die je waarschijnlijk zal krijgen en die veel
> zinniger zullen zijn dan die van mij...ik zou er ook even een referrer check
> in bouwen. Anders kan iedereen mailen via dat script. Dus iets als:
>
> if($waar_kom_je_vandaan != mijn_eigen_server_)
> {
> hoepel op
> }
> else
> {
> mail versturen
> }
>
Aangezien ik zelf de 'To: ' invul, denk ik dat dit script voor anderen
niet interessant is.
--
Arjen Haayman
-- cogito ergo bicyclo --
Arjen Haayman
05/10/04, 23:35
nmp wrote:
>>Tenzij anders vermeld in de handleiding, zou ik er nooit vanuit gaan
>>dat een PHP-functie 'veilig' is. In dit geval zou ik dus zeker de
>>$_REQUEST-waarden controleren.
>
>
> Inderdaad, in dit geval zeker omdat het requestwaarden zijn, maar als je
> die maar controleert dan lijkt me de aanroep van de functie beslist wel
> veilig.
Welke controles zal ik uitvoeren?
Het veiligst is om alleen een set toegestane karakters door te laten,
maar welke set zou dat dan moeten zijn?
Weet iemand hoe je mail() kunt misbruiken? (de server gebruikt sendmail).
function send_mail()
{
global $naam, $onderwerp, $email, $bericht;
mail( "ik@mijndomein.nl", #<--- geen exploit mogelijk??
"[vraag] $onderwerp", #<--- idem?
$bericht, #<--- idem?
"From: $naam <$email>\n"); /* <---- Mogelijk dat hier extra
headers aan toegevoegd kunnen worden? Hoe te voorkomen? */
}
--
Arjen Haayman
-- cogito ergo bicyclo --
Rene Pijlman
05/10/04, 23:35
Matthijs de Z:
>>Is het nodig om de invoer voor PHP's mail() functie te controleren op
>>onveilige code of doet de mail-functie dat voor je?
[...]
>Naast de vele opmerkingen die je waarschijnlijk zal krijgen en die veel
>zinniger zullen zijn dan die van mij...ik zou er ook even een referrer check
>in bouwen. Anders kan iedereen mailen via dat script.
Dit waag ik tegen te spreken. De referer kan client-side vervalst worden
en is dus van nul en generlei waarde als het om veiligheid gaat.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Rene Pijlman
05/10/04, 23:35
Branko Collin:
>>Tenzij vermeld in de handleiding, zou ik er nooit vanuit gaan
>>dat een PHP-functie 'veilig' is.
>
>Euh, dat moet natuurlijk "Tenzij vermeld" zijn. :-\
En zelfs dan zou ik er niet vanuit gaan, want ik heb weinig vertrouwen in
de PHP-manual.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Daniel Tryba
05/10/04, 23:45
Arjen Haayman <ahaayman@deadspam.com> wrote:
> Is deze code veilig?
>
> $naam = $_REQUEST[ 'naam'];
> $email = $_REQUEST[ 'email'];
> $onderwerp = $_REQUEST[ 'onderwerp'];
> $bericht = $_REQUEST[ 'bericht'];
>
> function send_mail()
> {
> global $naam, $onderwerp, $email, $bericht;
Hmmm, bad practice! Waarom op deze manier? Een copie van een superglobal
naar een variabele met de global scope!
> mail( "ik@mijndomein.nl",
> "[vraag] $onderwerp",
> $bericht,
> "From: $naam <$email>\n");
> }
Stel je voor dat $naam het volgende bevat:
"evil <spammer@example.com>\r\nCc: <iemand@example.com>, <anders@example.com>,"
even urlencoden en het kan zo in de URL worden gedumpt, mocht je een
referrer check inbouwen van wordt het spam script 3 regels langer.
--
Daniel Tryba
Hans Spaans
05/10/04, 23:45
In article <tj46m011ivf4ltvmgg5ecngnc8i82qo8ij@4ax.com>, Rene Pijlman wrote:
> Matthijs de Z:
>>>Is het nodig om de invoer voor PHP's mail() functie te controleren op
>>>onveilige code of doet de mail-functie dat voor je?
> [...]
>>Naast de vele opmerkingen die je waarschijnlijk zal krijgen en die veel
>>zinniger zullen zijn dan die van mij...ik zou er ook even een referrer check
>>in bouwen. Anders kan iedereen mailen via dat script.
>
> Dit waag ik tegen te spreken. De referer kan client-side vervalst worden
> en is dus van nul en generlei waarde als het om veiligheid gaat.
Ik durf dit te onderbouwen en ik noem een ding : Formmail.pl ;-)
Hans
--
"Helemaal zelfgebakken gentoo-kernels zijn dus minder geoptimaliseerd en
van mindere kwaliteit. :>"
-- Ruben van der Leij in nl.comp.os.linux.discussie
Rene Pijlman
06/10/04, 00:05
Arjen Haayman:
>Weet iemand hoe je mail() kunt misbruiken?
Een gangbare truc is via een header newlines met andere headers en
evenntueel een andere body toe te voegen. Zo zou het script wellicht
misbruikt kunnen worden om spam te versturen.
Een andere truc is gebruik te maken van eventuele buffer overruns om
willekeurige code uit te voeren, maar dat is zeer uitermate bijzonder
geavanceerd. Bovendien moeten er daarvoor bufferbugs zijn.
>(de server gebruikt sendmail).
Vergeet dan die laatste kanttekening maar. Sendmail is _het_
schoolvoorbeeld van een bufferbug-dierentuin.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Rene Pijlman wrote:
> En zelfs dan zou ik er niet vanuit gaan, want ik heb weinig vertrouwen in
> de PHP-manual.
Hee, daar hebben we het al lang niet meer over gehad! ;-)
Groeten,
Patrick
Rene Pijlman
06/10/04, 00:25
Patrick:
>Rene Pijlman:
>> En zelfs dan zou ik er niet vanuit gaan, want ik heb weinig vertrouwen in
>> de PHP-manual.
>
>Hee, daar hebben we het al lang niet meer over gehad! ;-)
Om de een of andere reden moet ik steeds aan de PHP-manual denken als de
LPF ruzie heeft.
Maar toch is dit wel een interessant punt. In de traditionele software
engineering ga je ervan uit dat een component aan zijn specificaties
voldoet. Als dat niet zo is, dan heeft de component een bug, niet de
applicatie die er gebruik van maakt.
Maar bij open source software wordt de documentatie vaak onafhankelijk
geschreven van de implementatie. Eigenlijk wordt er archeologie bedreven,
in plaats van informatica.
Dat roept de vraag op in hoeverre een deugende applicatiebouwer zich op de
documentatie mag beroepen, als het om veiligheid gaat. Er valt iets te
zeggen voor: niet.
Ofwel, OP: gij zult zelf uw data checken, alvorens het aan PHP en diens
functies toe te vertrouwen.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Op Tue, 05 Oct 2004 23:28:20 +0200, schreef Arjen Haayman:
> nmp wrote:
>>>Tenzij anders vermeld in de handleiding, zou ik er nooit vanuit gaan
>>>dat een PHP-functie 'veilig' is. In dit geval zou ik dus zeker de
>>>$_REQUEST-waarden controleren.
>>
>>
>> Inderdaad, in dit geval zeker omdat het requestwaarden zijn, maar als je
>> die maar controleert dan lijkt me de aanroep van de functie beslist wel
>> veilig.
> Welke controles zal ik uitvoeren?
> Het veiligst is om alleen een set toegestane karakters door te laten,
> maar welke set zou dat dan moeten zijn?
Alle ASCII tekens met een waarde van 32 (spatie) of hoger kun je gerust
accepteren in headervelden.
> Weet iemand hoe je mail() kunt misbruiken? (de server gebruikt sendmail).
>
> function send_mail()
> {
> global $naam, $onderwerp, $email, $bericht;
> mail( "ik@mijndomein.nl", #<--- geen exploit mogelijk??
> "[vraag] $onderwerp", #<--- idem?
> $bericht, #<--- idem?
> "From: $naam <$email>\n"); /* <---- Mogelijk dat hier extra
> headers aan toegevoegd kunnen worden? Hoe te voorkomen? */
Voor headergegevens (zoals onderwerp, geadresseerde, afzender) evt. een
max. lengte hanteren. 100 zal meestal wel werken, evt. bufferproblemen
treden meestal pas op bij meerdere honderden karakters. Sowieso strippen
van ongewenste karakters (ASCII beneden 32). Maar zaken zoals line feed,
carriage return, tab laat je natuurlijk wel staan in je $bericht.
E-mailadressen checken op geldigheid en evt. zelfs via SMTP checken of ze
werkelijk bestaan (daar zijn routines voor, heb ik nu niet bij de hand).
Verder vraag ik me af waarom je het from: adres uit een request zou moeten
lezen. Voordat iemand een mailtje mag sturen is-ie toch al
ingelogd/aangemeld neem ik aan? Dan kun je dat adres uit zijn
accountgegevens halen.
Maar ja, ik weet ook niet wat voor toepassing je eigenlijk bouwt.
Op Tue, 05 Oct 2004 23:32:46 +0200, schreef Rene Pijlman:
> Matthijs de Z:
>>>Is het nodig om de invoer voor PHP's mail() functie te controleren op
>>>onveilige code of doet de mail-functie dat voor je?
> [...]
>>Naast de vele opmerkingen die je waarschijnlijk zal krijgen en die veel
>>zinniger zullen zijn dan die van mij...ik zou er ook even een referrer check
>>in bouwen. Anders kan iedereen mailen via dat script.
>
> Dit waag ik tegen te spreken. De referer kan client-side vervalst worden
> en is dus van nul en generlei waarde als het om veiligheid gaat.
Noem het maar vervalst. Ik vind dat typisch een geval van "best practice"
vanuit privacy oogpunt, om een browser *geen* referer mee te laten
sturen. Raad ik iedereen aan.
Rene Pijlman
06/10/04, 00:55
nmp:
>Rene Pijlman:
>De referer kan client-side vervalst worden en is dus van nul en generlei
>waarde als het om veiligheid gaat.
>
>Noem het maar vervalst. Ik vind dat typisch een geval van "best practice"
>vanuit privacy oogpunt, om een browser *geen* referer mee te laten
>sturen. Raad ik iedereen aan.
Ah ja, mee eens, maar _geen_ referer zou het probleem niet moeten zijn.
Daar houdt elke applicatie als het goed is rekening mee. Maar vertrouwen
op de juistheid van de referer die er wel is, dat is het probleem.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Op Wed, 06 Oct 2004 00:45:09 +0200, schreef Rene Pijlman:
> nmp:
>>Rene Pijlman:
>>De referer kan client-side vervalst worden en is dus van nul en generlei
>>waarde als het om veiligheid gaat.
>>
>>Noem het maar vervalst. Ik vind dat typisch een geval van "best
>>practice" vanuit privacy oogpunt, om een browser *geen* referer mee te
>>laten sturen. Raad ik iedereen aan.
>
> Ah ja, mee eens, maar _geen_ referer zou het probleem niet moeten zijn.
> Daar houdt elke applicatie als het goed is rekening mee. Maar vertrouwen
> op de juistheid van de referer die er wel is, dat is het probleem.
Juist, maar hoe dan ook is die referer check dus onzin - zoals je al
aangaf. Dan kan men toch beter iets doen met een PHP sessie of iets
dergelijks.
Of gewoon niet van die algemene mail dingesen maken. Ik maak wel eens een
mail formuliertje in PHP maar dat is dan meestal om met de eigenaar van de
site in contact te komen. Adres van de geadresseerde is dus hard gecodeerd
of door middel van een include bestandje gedefinieerd.
Een formuliertje waarmee men zomaar onder elke willekeurige naam naar elke
willekeurige ontvanger kan sturen lijkt me echt niet meer van deze tijd,
zeg maar.
Of je moet misschien een mixmaster remailer hebben, dan heeft het wel weer
iets moois :)
John Bokma
06/10/04, 03:25
nmp <no@mail.please> wrote in
news:pan.2004.10.05.22.23.16.579088@mail.please:
> Voor headergegevens (zoals onderwerp, geadresseerde, afzender) evt.
> een max. lengte hanteren. 100 zal meestal wel werken, evt.
> bufferproblemen treden meestal pas op bij meerdere honderden
> karakters. Sowieso strippen van ongewenste karakters
NEE. Nooit strippen, maar netjes "die" doen wanneer er rommel in zit. Maak
gewoon netjes een specificatie wat *mag* en mep wanneer er iets afwijkt, ga
NOOIT input zitten repareren.
--
John Voorbeeldscripts in Perl:http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
Arjen Haayman
06/10/04, 08:45
John Bokma <postmaster@castleamber.com> wrote in message news:<Xns9579CEA925FBAcastleamber@130.133.1.4>...
> Maak
> gewoon netjes een specificatie wat *mag* en mep wanneer er iets afwijkt
Dan nu nogmaals m'n vraag: wat is een veilige set karakters om toe te
staan in de variabelen $naam en $email? Of welke mogen er beslist niet
in voorkomen?
Ik lees her en der dat m.n. het email-adres moeilijk te valideren is,
of is daar ook een PHP-module voor?
BTW: het moge duidelijk zijn dat ik een PHP-newbie ben :-|
Arjen Haayman
John Bokma
06/10/04, 08:55
ahaayman@hotmail.com (Arjen Haayman) wrote in
news:d260151f.0410052238.382c1ca0@posting.google.c om:
> John Bokma <postmaster@castleamber.com> wrote in message
> news:<Xns9579CEA925FBAcastleamber@130.133.1.4>...
>> Maak
>> gewoon netjes een specificatie wat *mag* en mep wanneer er iets
>> afwijkt
>
> Dan nu nogmaals m'n vraag: wat is een veilige set karakters om toe te
> staan in de variabelen $naam en $email? Of welke mogen er beslist niet
> in voorkomen?
Alles onder de spatie zou ik niet toestaan. Geen idee hoe dat zit met
unicode.
> Ik lees her en der dat m.n. het email-adres moeilijk te valideren is,
> of is daar ook een PHP-module voor?
Er is ergens een Perl expressie die erg omvangrijk is, en in de buurt
schijnt te komen :-D
> BTW: het moge duidelijk zijn dat ik een PHP-newbie ben :-|
Laat je brouwsel door iemand nalopen die de nodige PHP kennis heeft.
--
John Voorbeeldscripts in Perl:http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
John Bokma <postmaster@castleamber.com>:
> ahaayman@hotmail.com (Arjen Haayman) wrote in
> news:d260151f.0410052238.382c1ca0@posting.google.c om:
>
>> Ik lees her en der dat m.n. het email-adres moeilijk te valideren is,
>> of is daar ook een PHP-module voor?
>
> Er is ergens een Perl expressie die erg omvangrijk is, en in de buurt
> schijnt te komen :-D
Zie bijvoorbeeld halverwege
http://search.cpan.org/src/MAURICE/Email-Valid-0.15/Valid.pm
Ik vind
http://search.cpan.org/src/ABIGAIL/RFC_RFC822_Address-1.5/Address.pm ook
wel een mooie oplossing :)
--
robert
Rene Pijlman
06/10/04, 11:15
Arjen Haayman:
>Dan nu nogmaals m'n vraag: wat is een veilige set karakters om toe te
>staan in de variabelen $naam en $email?
Dat staat in RFC 822.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Arjen Haayman
06/10/04, 19:25
robert wrote:
> Zie bijvoorbeeld halverwege
> http://search.cpan.org/src/MAURICE/Email-Valid-0.15/Valid.pm
>
> Ik vind
> http://search.cpan.org/src/ABIGAIL/RFC_RFC822_Address-1.5/Address.pm ook
> wel een mooie oplossing :)
>
Dus al die PHP-gebruikers hebben nog niets gemaakt? Zijn alle
php-mail-formulieren of is moet iedereen het wiel opnieuw uitvinden?
Ik verwacht dus eigenlijk dat de algemeen gebruikte mail() functie (of
een andere module) alle ervaringen van iedereen bundelt. Of is dat
teveel gevraagd?
--
Arjen Haayman
-- cogito ergo bicyclo --
Arjen Haayman
06/10/04, 22:15
robert wrote:
>
> Zie bijvoorbeeld halverwege
> http://search.cpan.org/src/MAURICE/Email-Valid-0.15/Valid.pm
>
> Ik vind
> http://search.cpan.org/src/ABIGAIL/RFC_RFC822_Address-1.5/Address.pm ook
> wel een mooie oplossing :)
>
Willen jullie zeggen dat er voor PHP niets is om veilig mail te
gebruiken? Moet iedereen zelf het wiel uitvinden of gigantische
reguliere expressies uit perl vertalen naar PHP???
--
Arjen Haayman
-- cogito ergo bicyclo --
Arjen Haayman <ahaayman@deadspam.com>:
> robert wrote:
>
>> Zie bijvoorbeeld halverwege
>> http://search.cpan.org/src/MAURICE/Email-Valid-0.15/Valid.pm
>>
>> Ik vind
>> http://search.cpan.org/src/ABIGAIL/RFC_RFC822_Address-1.5/Address.pm
>> ook wel een mooie oplossing :)
>
> Willen jullie zeggen dat er voor PHP niets is om veilig mail te
> gebruiken?
In PEAR zit een Mail_RFC822::Mail_RFC822() waarvan geclaimd wordt dat het
e-mail adressen kan checken op geldigheid.
De meeste PHP-voorbeeldcode voor geldige e-mail adressen die je met Google
vindt is erg brak.
--
robert
Michiel de Roo
07/10/04, 13:15
nmp wrote:
> Een formuliertje waarmee men zomaar onder elke willekeurige naam naar elke
> willekeurige ontvanger kan sturen lijkt me echt niet meer van deze tijd,
> zeg maar.
Nee, dat is gewoon een open proxy, buitengewoon overstandig.