PHP Säker E-post
- Föregående sida PHP E-post
- Nästa sida PHP Error
Det finns en sårbarhet i PHP e-postskriptet från föregående avsnitt.
PHP E-post注入
Först, titta på PHP-koden i föregående avsnitt:
<html> <body> <?php om (isset($_REQUEST['email'])) //Om "email" är ifyllt, skicka e-post { //Skicka e-post $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("someone@example.com", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } else //Om "email" inte är ifyllt, visa formuläret { echo "<form method='post' action='mailform.php'> E-post: <input name='email' type='text' /><br /> Ämne: <input name='subject' type='text' /><br /> Meddelande:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>
Det som är problemet med ovanstående kod är att obehöriga användare kan lägga till data i e-posthuvudet genom att fylla i formuläret.
Om användaren lägger till dessa texter i formulärens textfält, vad händer då?
someone@example.com%0ACc:person2@example.com %0ABcc:person3@example.com,person3@example.com, anotherperson4@example.com,person5@example.com %0ABTo:person6@example.com
Som vanligt lägger mail() -funktionen texten ovan i e-posthuvudet, så nu har huvudet extra fält för Cc:, Bcc: och To:. När användaren klickar på submit-knappen skickas detta e-postmeddelande till alla adresser ovan!
PHP förhindra e-postinjektion
Det bästa sättet att förhindra e-postinjektion är att validera inmatningen.
Följande kod är liknande föregående avsnitt, men vi har nu lagt till inmatningsvalidering för formulärets e-postfält:
<html> <body> <?php function spamcheck($field) { //filter_var() rengör e-post $field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() validerar e-post om(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; } } om (isset($_REQUEST['email'])) //om "e-post" är ifyllt, fortsätt //kontrollera om e-postadressen är ogiltig $mailcheck = spamcheck($_REQUEST['email']); om ($mailcheck==FALSE) { echo "Ogiltig inmatning"; } else //skicka e-post $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("someone@example.com", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } } else //if "email" is not filled out, display the form echo "<form method='post' action='mailform.php'> E-post: <input name='email' type='text' /><br /> Ämne: <input name='subject' type='text' /><br /> Meddelande:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>
I ovanstående kod använde vi PHP-filter för att validera inmatningen:
- FILTER_SANITIZE_EMAIL tar bort otillåtna tecken från e-poststrängen
- FILTER_VALIDATE_EMAIL verifierar e-postadress
Du kan hitta mer information om PHP FilterLäs mer om filter i detta avsnitt.
- Föregående sida PHP E-post
- Nästa sida PHP Error