[PHP] MailMessage Bug when trying to mail URL?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een mailmessage geschreven die een URL moet versturen die tevens variabele meestuurt.

Alleen krijg ik niet de goede url in mijn mailbox, lijkt te komen door de = teken die erin staat.

zie code:

PHP:
1
$url = "comment_id=".$comment_id."&hash=".$hash;


output in mailbox:

comment_id: 73
hash: 4e5f7d1e4db35e80f36f449926becb6b

Om je reactie op de column te activeren moet onderstaande link worden geklikt
id=&hashN5f7d1e4db35e80f36f449926becb6b


Weird?

Iemand hier een idee? Op Jacqieline.com etc. komen ze er niet uit

gr. Ken

[ Voor 5% gewijzigd door Verwijderd op 27-04-2004 16:32 ]


Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17:49

ripexx

bibs

H'm wat dacht je van debuggen, dus print eens iets naar het scherm ipv blijven mailen enzo ;)

Oja dit is iets netter en veel minder fout gevoelig
PHP:
1
$url = "id=".$column_id."&hash=".$hash;

[ Voor 11% gewijzigd door ripexx op 27-04-2004 16:25 ]

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

  • Markieman
  • Registratie: December 2001
  • Laatst online: 01-06 11:37
Verwijderd schreef op 27 april 2004 @ 16:23:
zie code:

$url = "id=$column_id&hash=$hash";

output in mailbox:

comment_id: 73
hash: 4e5f7d1e4db35e80f36f449926becb6b

Om je reactie op de column te activeren moet onderstaande link worden geklikt
id=&hashN5f7d1e4db35e80f36f449926becb6b
Wat mij al tegenstrijdig overkomt is dat je in de $url praat over $column_id maar dat het 4 regels verder ineens comment_id heet...

misschien: $url = "id=$comment_id&hash=$hash";

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik print ook alles in de browser.. alles komt er oke uit..

Valt het onder Debuggen? Ik heb namelijk alle opties geprobeerd en zie geen fouten... Ook jouw reply al eens eerder geprobeerd.

PHP:
1
"id=".$column_id."&hash=".$hash;


Moet idd comment_id zijn, zit al te lang naar het scherm te kijken.. hehe.
Lost overigens niks op als ik het naar comment_id verander.

[ Voor 27% gewijzigd door Verwijderd op 27-04-2004 16:30 ]


Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17:49

ripexx

bibs

Dan ga je toch naar de volgende stap: wat staat er in de source van het mailtje ;) Klopt dat ook nog of staat daar ook een fout in. Probeer te isoleren en geef ook eens het relevante mailscript. :)

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke, even een groot gedeelte van de script:

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?
//variabele uit URL ophalen
$column_id = $_GET['column_id'];

if($submit)
{
    if (!$name || !$email || !$comment){    
    echo "Please fill in all fields</div>";
    echo "<a href=\"javascript:history.back()\" class=\"bluelink\">[Back]</a>";
    exit;   
    }
    else {
        if (ereg("[A-Za-z0-9_-]+([\.]{1}[A-Za-z0-9_-]+)*@[A-Za-z0-9-]+([\.]{1}[A-Za-z0-9-]+)+",$email)) { 
            

            include ("include/connect.php");
            //alle gegevens in database plaatsen
            $query = "insert into dj_comments (comment_id, name, email, comment, column_id, hash) values ('', '$name', '$email', '$comment', '$column_id', '')";
            mysql_query($query) or die (mysql_error());

            //het ID ophalen van deze toegevoegde comment en een hash maken 
            if (mysql_affected_rows()>0) $comment_id=mysql_insert_id(); 
            $hash = md5($comment_id.time());

            //gegevens in database updaten en een hash toevoegen
            $query = "update dj_comments set hash='$hash' where comment_id='$comment_id'";
            mysql_query($query) or die (mysql_error());

            $url = "comment_id=".$comment_id."&hash=".$hash;
            $provider_name = "blaat";
            $provider_email = "info@blaat.nl";

                    $MailMessage .= "Naam: $name<br>\n";
                    $MailMessage .= "Comments: $comment<br>\n";
                    $MailMessage .= "comment_id: $comment_id<br>\n";
                    $MailMessage .= "hash: $hash<br>\n";
                    $MailMessage .= "<br>\n<br>\n";
                    $MailMessage .= "Om je reactie op de column van BLAAT te activeren moet onderstaande link worden geklikt<br>\n";
                    $MailMessage .= "$url\n";
                    $toadress = "$email";
                    $subject = "Activeer jouw reactie op de column van BLAAT";
                    $mime_boundary = "----=_NextPart_000_0010_01C0B64F.3F216A40";       // standaard headerfiles
                    $headers .= "Date: " . (date( "l dS of F Y h:i:s A")) . "\n";
                    $headers .= "From: \"" . $provider_name . "\"<". $provider_email . ">\n";
                    $headers .= "Return-Path: " . $_email . "\n";
                    $headers .= "X-Sender: " . $_email . "\n";
                    $headers .= "X-Mailer: Artform Media\n";
                    $headers .= "MIME-version: 1.0\n";
                    $headers .= "Content-type: multipart/mixed; ";
                    $headers .= "boundary=\"$mime_boundary\"\n";
                    $headers .= "X-Priority: 3\n";
                    $headers .= "Content-transfer-encoding: 7BIT\n";
                    $message = "This is a multi-part message in MIME format.\n\n";
                    $message .= "--" . $mime_boundary . "\n";
                    $message .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
                    $message .= "Content-Transfer-Encoding: quoted-printable\n\n";
                    $MailMessage .= "<br>\n<br>\n<br>\n";
                    $MailMessage .= "Artform Media<br>\n";
                    $MailMessage .= "www.artform.org<br>\n";
                    $message .= $MailMessage . "\n";
                    if(mail($toadress, $subject, $message, $headers))
                    {
                        print "$email = oke<br>";
                        print "$name<br>";
                        print "$comment<br>";
                        print "$hash<br>";
                        print "$comment_id<br>";    
                    }
                    else
                    {
                        print "Helaas, er ging iets mis.";
                    }

        }
        else {
        print "$email = ongeldig emailadres<br>$name<br>$comment";
        }   
    }
}
else {
    //formulier
?>

[ Voor 92% gewijzigd door Verwijderd op 27-04-2004 16:37 ]


Acties:
  • 0 Henk 'm!

  • blizt
  • Registratie: Januari 2003
  • Laatst online: 11-12-2024

blizt

Wannabe-geek

PHP:
1
$column_id = $_GET['column_id'];

Lekker veilig :D

Heb je error_reporting op E_ALL staan? (Zo nee, doe dat 'ns)

United we stand, and divided we fall


Acties:
  • 0 Henk 'm!

Verwijderd

in mailtjes wordt een = gebruikt ipv % (in internetexploiter), dus =4e is dus zelfde als een N.
=3D is netter om te gebruiken in mailtjes

Acties:
  • 0 Henk 'm!

  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 15-09 21:49

CodeIT

Code IT

Verwijderd schreef op 27 april 2004 @ 16:34:
.....
PHP:
1
$message .= "Content-Transfer-Encoding: quoted-printable\n\n";
Hier staat dat quoted printable wordt gebruikt. Als je dit gebruikt zitten er bepaalde beperkingen aan de characters die je kunt sturen (bijv. de '=').

Je kunt of de content-transfer-encoding aanpassen naar bv. 7 of 8bit, of je kunt quoted-printable content sturen. (Dan wordt de '=' idd vervangen door '=3d').
Hier is meer uitleg: http://en.wikipedia.org/wiki/Quoted-printable

[ Voor 6% gewijzigd door CodeIT op 27-04-2004 17:52 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:43
Denk er ook even aan dat afhankelijk van je PHP configuratie (dat wil zeggen: als magic quotes uitstaan) je script niet bestand is tegen SQL injection attacks. Ik wil er wel over uitweiden, maar eigenlijk is dat niet het onderwerp van discussie. Zorg wel dat je hier rekening mee houdt, als je wil voorkomen dat je database door een willekeurige gebruiker leeggegooid wordt.

Acties:
  • 0 Henk 'm!

Verwijderd

Waarom niet gewoon dit? PHP herkent automatisch de variabelen binnen de string dus als het goed is werkt dit gewoon:
PHP:
1
$url = "comment_id=$comment_id&hash=$hash";


edit:
of $column_id zoals al eerder werd vermeld :)

[ Voor 23% gewijzigd door Verwijderd op 27-04-2004 18:23 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 27 april 2004 @ 18:17:
Waarom niet gewoon dit? PHP herkent automatisch de variabelen binnen de string dus als het goed is werkt dit gewoon:
PHP:
1
$url = "comment_id=$comment_id&hash=$hash";


edit:
of $column_id zoals al eerder werd vermeld :)
als je de hele thread ff had gelezen had je in de gaten hebben gehad dat het niet een probleem van variablen is van php, maar de manier waarop ze door outlook of andere email clients behandeld worden...

[ontopic]
$url = "comment_id&nbps;$comment_id&hash $hash";
dat wil ook wel werken als het met =3D niet wil lukken
[/ontopic]

[ Voor 6% gewijzigd door Verwijderd op 27-04-2004 22:58 . Reden: wat net iets meer ontopic :) ]


Acties:
  • 0 Henk 'm!

  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 15-09 21:49

CodeIT

Code IT

Het mooiste is natuurlijk om de mime part als quoted-printable te versturen. Php heeft wel een functie om quoted-printable te decoden maar niet om te encoden.
Hier een stukje source van php.net voor een implementatie van het encoderen naar quoted-printable:
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
function qp_enc( $input = "", $line_max = 76, $space_conv = false ) {

   $hex = array('0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F');
   $lines = preg_split("/(?:\r\n|\r|\n)/", $input);
   $eol = "\r\n";
   $escape = "=";
   $output = "";

       while( list(, $line) = each($lines) ) {
               //$line = rtrim($line); // remove trailing white 
space -> no =20\r\n necessary
               $linlen = strlen($line);
               $newline = "";
               for($i = 0; $i < $linlen; $i++) {
                       $c = substr( $line, $i, 1 );
                       $dec = ord( $c );
                       if ( ( $i == 0 ) && ( $dec == 46 ) ) { // 
convert first point in the line into =2E
                               $c = "=2E";
                       }
                       if ( $dec == 32 ) {
                               if ( $i == ( $linlen - 1 ) ) { // convert
 space at eol only
                                       $c = "=20";
                               } else if ( $space_conv ) {
                                       $c = "=20";
                               }
                       } elseif ( ($dec == 61) || ($dec < 32 ) || 
($dec > 126) ) { // always encode "\t", which is *not* required
                               $h2 = floor($dec/16);
                               $h1 = floor($dec%16);
                               $c = $escape.$hex["$h2"].$hex["$h1"];
                       }
                       if ( (strlen($newline) + strlen($c)) >= 
$line_max ) { // CRLF is not counted
                               $output .= $newline.$escape.$eol; // 
soft line break; " =\r\n" is okay
                               $newline = "";
                               // check if newline first character will 
be point or not
                               if ( $dec == 46 ) {
                                       $c = "=2E";
                               }
                       }
                       $newline .= $c;
               } // end of for
               $output .= $newline.$eol;
       } // end of while
       return trim($output);
}


Nog iets, je geeft aan dat je een multipart/mixed mailtje gaat versturen, maar je stuurt een gewone text/html mail.
Om een plain text versie van je mail toe te voegen kun je multipart/alternative gebruiken (en je boundary gebruiken om de grenzen aan te geven).
En dan nog als laatste: je werkt met een boundary. En een boundary hoort te worden geclosed met je boundary value en een '--' erachter.

De meeste mailclients pakken dit soort mailtjes wel, maar sommige gaan hopeloos de fout in. Bekijk anders ff de rfc van mime: http://www.faqs.org/rfcs/rfc2045.html

[ Voor 19% gewijzigd door CodeIT op 28-04-2004 00:36 ]


Acties:
  • 0 Henk 'm!

  • Markieman
  • Registratie: December 2001
  • Laatst online: 01-06 11:37
Verwijderd schreef op 27 april 2004 @ 17:40:
in mailtjes wordt een = gebruikt ipv % (in internetexploiter), dus =4e is dus zelfde als een N.
=3D is netter om te gebruiken in mailtjes
Niet helemaal...

In een URL (URI) wordt % gebruikt, ofwel een spatie wordt %20

Als je dit in een (quoted-printable) mail wilt zetten moet je NIET de %20 vervangen door =XX maar de URL in zijn geheel coderen met Quoted Printable...

Aangezien het procentteken en cijfers niet gecodeerd hoeven te worden hoef je daar geen rekening mee te houden, alleen het = teken zelf wel natuurlijk =)

[ Voor 4% gewijzigd door Markieman op 28-04-2004 12:14 ]

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het lag inderdaad aan de manier waarop ik het mailtje probeerde te versturen.

Inmiddels heb ik de hele mailmessage aangepast en ziet het er nu zo uit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
                    //mailmessage
                    $header = "From: $provider_name <$provider_email>\n"; 
                    $header .= "MIME-Version: 1.0\n"; 
                    $header .= "Content-Type: text/html;\n"; 
                    $header .= "Content-Transfer-Encoding: 7bit"; 
                    $onderwerp = "Please, activate your comment!"; 
                    $bericht = "Please visit the following url to activate your comment on the column of DJ Ken:<br> 
                    <a href=\"".$domein."content.php?page=cactivate&id=".$comment_id."&amp;hash=".$hash."\">
".$domein."content.php?page=cactivate&id=".$comment_id."&amp;hash=".$hash."</a><br> 
                    <br>
                    -------------<br> 
                    <a href=\"".$domein."\">".$domein."</a>"; 
                    if(mail($email, $onderwerp, $bericht, $header))
                    {



Dit werkt dus wel... Bedankt voor alle reactie en hulp, ben weer en stuk wijzer geworden :) _/-\o_

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
blizt schreef op 27 april 2004 @ 17:35:
PHP:
1
$column_id = $_GET['column_id'];

Lekker veilig :D

Heb je error_reporting op E_ALL staan? (Zo nee, doe dat 'ns)
Kan je mij uitleggen waarom dat niet veilig is?

Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Verwijderd schreef op 29 april 2004 @ 12:30:
[...]
Kan je mij uitleggen waarom dat niet veilig is?
Ik kan het helemaal uit gaan leggen, maar zoek eens naar "SQL injection".

Als de gebruiker (lees : Potentieel kwaadwillend persoon), een ' in column_id stopt, dan is je query ongeldig.

Dat is niet zo erg, maar hij kan zelfs de hele query gaan verbouwen, en dat wil je niet.

Overigens is dit probleem er niet als je magic_quotes_gpc aan hebt staan :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
eamelink schreef op 29 april 2004 @ 12:33:
[...]


Ik kan het helemaal uit gaan leggen, maar zoek eens naar "SQL injection".

Als de gebruiker (lees : Potentieel kwaadwillend persoon), een ' in column_id stopt, dan is je query ongeldig.

Dat is niet zo erg, maar hij kan zelfs de hele query gaan verbouwen, en dat wil je niet.

Overigens is dit probleem er niet als je magic_quotes_gpc aan hebt staan :)
Thnks voor je reply! Ik ga ff researchen, aangezien ik zo save, goed en correct mogelijk wil programmeren...

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Over veiligheid gesproken:

PHP:
1
$query = "insert into dj_comments (comment_id, name, email, comment, column_id, hash) values ('', '$name', '$email', '$comment', '$column_id', '')";


Ik mag hopen dat je de single quotes in bijv $comment escaped, anders is het mogelijk om aan sql injection te doen.

Bijv: $comment = "', '');drop table dj_comment;"
Pagina: 1