Email an toàn bằng PHP
- Trang trước PHP E-mail
- Trang tiếp theo PHP lỗi
Trong đoạn mã PHP e-mail trong phần trước, có một lỗ hổng.
PHP E-mail注入
Trước hết, hãy xem mã PHP trong phần trước:
<html> <body> <?php if (isset($_REQUEST['email'])) //Nếu đã điền email, gửi email { //Gửi email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("someone@example.com", "Chủ đề: $subject", $message, "From: $email" ); echo "Cảm ơn bạn đã sử dụng biểu mẫu gửi email của chúng tôi"; } else //Nếu không điền email, hiển thị biểu mẫu { echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text' /><br /> Chủ đề: <input name='subject' type='text' /><br /> Tin nhắn:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>
Vấn đề của đoạn mã trên là người dùng không có quyền có thể chèn dữ liệu vào tiêu đề email thông qua biểu mẫu.
Nếu người dùng thêm văn bản này vào ô nhập trên biểu mẫu, sẽ xảy ra điều gì?
someone@example.com%0ACc:person2@example.com %0ABcc:person3@example.com,person3@example.com, anotherperson4@example.com,person5@example.com %0ABTo:person6@example.com
Như thường lệ, hàm mail() sẽ đặt văn bản trên vào phần đầu của email, vì vậy bây giờ đầu email có thêm các trường Cc:, Bcc: và To:. Khi người dùng nhấn nút gửi, email này sẽ được gửi đến tất cả các địa chỉ trên!
PHP ngăn chặn chèn email
Cách tốt nhất để ngăn chặn việc chèn email là kiểm tra đầu vào.
Mã dưới đây tương tự như phần trước, nhưng chúng ta đã thêm chương trình kiểm tra xác thực đầu vào của trường email trong biểu mẫu:
<html> <body> <?php function spamcheck($field) { //filter_var() làm sạch email $field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() xác thực email if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; } } if (isset($_REQUEST['email'])) //nếu "email" được điền, tiếp tục //kiểm tra địa chỉ email có hợp lệ không $mailcheck = spamcheck($_REQUEST['email']); if ($mailcheck==FALSE) { echo "Đầu vào không hợp lệ"; } else //gửi email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("someone@example.com", "Chủ đề: $subject", $message, "From: $email" ); echo "Cảm ơn bạn đã sử dụng biểu mẫu gửi email của chúng tôi"; } } else {//nếu "email" không được điền đầy đủ, hiển thị biểu mẫu echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text' /><br /> Chủ đề: <input name='subject' type='text' /><br /> Tin nhắn:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>
Trong đoạn mã trên, chúng tôi đã sử dụng bộ lọc PHP để xác thực đầu vào:
- FILTER_SANITIZE_EMAIL loại bỏ ký tự không hợp lệ của email từ chuỗi
- FILTER_VALIDATE_EMAIL xác thực địa chỉ email
Bạn có thể trong PHP bộ lọcTrong phần này, bạn có thể đọc thêm về bộ lọc.
- Trang trước PHP E-mail
- Trang tiếp theo PHP lỗi