php mail() header insert

Pagina: 1
Acties:
  • 112 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 157625

Topicstarter
Goedendag,

Op mijn website heb ik een heel simpel invoerveld waar mensen hun mail adres kunnen voeren zodat ze worden toegevoegd aan een mailinglist. Dit gaat via een heel simpel formulier:

code:
1
2
3
4
<form action="tiptip.php?task=add" method="post">
<input name="adres" value="vul hier je adres in" type="text" /><br>
<input type="submit" value="voeg me toe!" />
</form>


Nu heb ik her en der op het web gelezen dat er wat gevaren vastzitten aan het versturen van mail via de mail() functie, het zogenaamde header-insertion probleem. Meestal wordt dit probleem beschreven aan de hand van een voorbeeld waarbij ook de afzender en het bericht kunnen worden ingevuld. Nu is mijn vraag dus, loop ik een risico met zulk een simpel formuliertje?

De data wordt als volgt verwerkt:

code:
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
function addadress($adr){

    $sqlcheck= "SELECT adres FROM adressen";
    $check= mysql_query($sqlcheck);
    $flag=0;
    
    while($row3 = mysql_fetch_array($check)){
        if($row3['adres']==$adr){$flag=1;}
    }

    
    if($flag == 0){ 
        $SQLinsert = "INSERT INTO adressen SET adres = '$adr'";
        $insert = mysql_query($SQLinsert);
        send_test_mail($adr); //stuurt een testmailtje met de melding dat hij/zij is toegevoegd
        echo('Je bent nu toegevoegd aan het Newton TIPtip<sup>&copy; </sup> systeem');
    }

    if($flag == 1){
        $sqldel= "DELETE FROM adressen WHERE adres = '$adr'";
        $del = mysql_query($sqldel);
        send_last_mail($adr);
        echo('Je stond er al in, nu ben je uitgeschreven!');    
    }

}


Met vriendelijke groet en bijvoorbaat dank voor de reacties,

Jan

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 12-06 18:55

Gerco

Professional Newbie

Aangezien je de aanroep van de mail() functie niet laat zien, kunnen we daar natuurlijk niets over zeggen...

Verder kan je check functie wel iets handiger:
PHP:
1
2
3
4
    $sqlcheck= sprintf("SELECT adres FROM adressen WHERE adres='%s'",
      mysql_escape_string($adr));
    $check= mysql_query($sqlcheck);
    $flag = mysql_num_rows($check) > 0;


Je vergeet verder ook om $adr te escapen (zoals in bovenstaand voorbeeld), dus je code is kwetsbaar voor SQL injection. Dat is een Bad Thing™.

[ Voor 100% gewijzigd door Gerco op 20-03-2006 13:03 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

Anoniem: 88197

Gerco schreef op maandag 20 maart 2006 @ 12:58:
Aangezien je de aanroep van de mail() functie niet laat zien, kunnen we daar natuurlijk niets over zeggen...
Je bedoelt send_check_mail zeker :)

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 12-06 18:55

Gerco

Professional Newbie

Nee, ik bedoel de PHP functie mail(). Die moet je aanroepen om mail te sturen. send_test_mail() en send_last_mail() zijn geen PHP functies en de implementatie daarvan is niet gegeven. Die is dus ook niet te beoordelen op veiligheid.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

Anoniem: 157625

Topicstarter
Dank voor de snelle reacties!

Hier is de code waar de mail() functie wordt aangeroepen:

code:
1
2
3
4
5
6
7
8
9
10
11
function send_test_mail($adr){
$headers = "From: dinges@ergens.nl\n";
$headers .= "Return-Path: dinges@ergens.nl\n";
mail($adr,'TIPtip systeem','Hallo, je bent INgeschreven bij het Tiptip systeem',$headers);
}

function send_last_mail($adr){
$headers = "From: dinges@ergens.nl\n";
$headers .= "Return-Path: dinges@ergens.nl\n";
mail($adr,'TIPtip systeem','Hallo, je bent UITgeschreven bij het Tiptip systeem',$headers);
}


@Gerco: Wat bedoel je met het escapen van $adr ?

Groeten,

Jan

Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Zo mijn eerste idee is dat je niet kwetsbaar bent voor dit header insert gedoe aangezien je geen externe variabele in de header zet.

Maar even (offtopic) over je code; Je laat mensen een adres invullen en als ze er al in staan gooi je ze er uit. Is dat wel een goede methode? Zou je niet een apart gedeelte voor in en uitschrijven maken? (En misschien beveiligen zodat een bevestigingsbericht nodig is voor beide acties?)

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:05
Wanneer je het adres nergens checkt op line-breaks ben je wel vatbaar voor mime injection. Dat komt omdat het adres van de ontvanger gewoon in een to: header komt. Wanneer ik in jouw script hetvolgende als adres zou geven:
code:
1
2
3
4
5
spamontvanger0@domein.com, spamontvanger1@domein.com, spamontvanger2@domein.com
content-type: text/plain
subject: very cheap viagra

H@ving erection problems?

Dan stuur ik spam vanaf jouw domein. PHP plakt het to: adres immers gewoon in de headers. En aangezien jij niets checkt kan ik met een paar enters extra headers een alternatieve body je mailscript insturen.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Superdeboer
  • Registratie: December 2002
  • Niet online

Superdeboer

Sa-weee-tah

Kijk eens in [rml][ PHP?] gevaren van MIME injectie (Cross Site Scripting?)[/rml], waar dit probleem uitgebreid aan de orde is gekomen. Wanneer je niet checkt of $adr precies dat bevat wat jij wilt hebben (namelijk slechts één mailadres), dan zou het kunnen dat iemand daar dus óf hele nieuwe headers toevoegt door gebruik van \r\n (na een linebreak kan er namelijk een nieuwe header ingevoegd worden, waar jij dus niet in voorzien hebt). Of, zoals T-MOB zegt, kan hij gewoon een stuk of honderd extra geadresseerden toevoegen door deze slechts met komma's te scheiden. Jij gooit dat hele zooitje zo in je To-header en klaar is de spammer. ;)

When I write my code, only God and I know what it means. One week later, only God knows.
Hell yes it's a Cuban Cigar, but I'm not supporting their economy, I'm burning their fields.

Pagina: 1