이전 포스트에서 보여드렸던 PHP 이메일 스크립트에는 약점이 있습니다.
PHP 이메일 인젝션(E-mail Injections)
일단, 이전 포스트에서 보여드렸던 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() 함수는 언제나 그렇듯이 위의 글자들을 메일 헤더에 넣을테고, 이제 헤더는 추가적으로 Cc:, Bcc:, To: 필드를 더 가지게 됩니다.
PHP 이메일 인젝션 방지하기(Stopping E-mail Injections)
이메일 인젝션을 방지하는 최상의 방법은 입력의 유효성을 점검하는 것이겠지요.
아래의 코드는 이전의 포스트와 같지만, 입력되는 값의 유효성을 검사하는 기능이 추가되었습니다:
<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 필터는 값을 이메일 주소로서 맞는지 유효성을 검사합니다.