PHP 보안 이메일
PHP 이메일
PHP 오류
이전 섹션에 PHP 이메일이 있습니다. 메일 스크립트의 취약점.
PHP 이메일 삽입
먼저 이전 섹션의 PHP 코드를 살펴보세요.
<html> <body> <?php if (isset($_REQUEST['email'])) //if "email" is filled out, send email { //send email $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'> Email: <input name='email' type='text' /><br /> Subject: <input name='subject' type='text' /><br /> Message:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>
위 코드의 문제점은 권한이 없는 사용자의 데이터가 입력 양식을 통해 이메일 헤더에 삽입할 수 있습니다.
사용자가 양식의 입력 상자에 이러한 텍스트를 추가하면 어떻게 되나요?
someone@example.com%0ACc:person2@example.com
%0ABcc:person3@example.com,person3@example.com,
anotherperson4@example. com,person5@example.com
%0ABTo:person6@example.com
평소와 마찬가지로 mail() 함수는 위의 텍스트를 이메일 헤더에 넣으므로 이제 헤더가 추가되었습니다. 추가 참조:, 숨은 참조: 및 받는 사람: 필드. 사용자가 제출 버튼을 클릭하면 이 이메일이 위의 모든 주소로 전송됩니다!
PHP의 이메일 삽입 방지
이메일 삽입을 방지하는 가장 좋은 방법은 입력 내용을 검증하는 것입니다.
다음 코드는 이전 섹션과 유사하지만 양식에서 이메일 필드를 감지하기 위해 입력 유효성 검사기를 추가했습니다.
<html> <body> <?php function spamcheck($field) { //filter_var() sanitizes the e-mail //address using FILTER_SANITIZE_EMAIL $field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() validates the e-mail //address using FILTER_VALIDATE_EMAIL if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; } } if (isset($_REQUEST['email'])) {//if "email" is filled out, proceed //check if the email address is invalid $mailcheck = spamcheck($_REQUEST['email']); if ($mailcheck==FALSE) { echo "Invalid input"; } else {//send email $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'> Email: <input name='email' type='text' /><br /> Subject: <input name='subject' type='text' /><br /> Message:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>
위 코드에서는 PHP 필터링을 사용합니다. 입력을 확인하려면:
FILTER_SANITIZE_EMAIL 문자열에서 이메일의 잘못된 문자를 제거합니다.
FILTER_VALIDATE_EMAIL 이메일 주소 확인