이전 섹션의 PHP 이메일 스크립트에는 취약점이 있습니다.
먼저 이전 장의 PHP 코드를 살펴보세요.
<html><head><meta charset="utf-8"><title>코더 튜토리얼(codercto.com)</title></head><body><?phpif (isset($_REQUEST['email' ] )) { // 이메일 매개변수를 받으면 이메일을 보냅니다. // 이메일을 보냅니다. $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $_REQUEST['message'] ; mail("[email protected]", $subject, $message, "From:" . $email) echo "메일이 성공적으로 전송되었습니다.";} else { // 이메일이 없는 경우 매개변수 다음 표시 양식 echo "<form method='post' action='mailform.php'> 이메일: <input name='email' type='text'><br> 제목: <input name='subject' type='text'><br> 메시지:<br> <textarea name='message' 행='15' cols='40'> </textarea><br> <input type='submit'> </form >";}?></body></html>
위 코드의 문제점은 승인되지 않은 사용자가 입력 양식을 통해 이메일 헤더에 데이터를 삽입할 수 있다는 것입니다.
사용자가 이메일 양식의 입력 상자에 다음 텍스트를 추가하면 어떻게 될까요?
[email protected]%0ACc:[email protected]%0ABcc:[email protected],[email protected],[email protected],[email protected]%0ABTo:[email protected]
평소와 같이 mail() 함수는 위의 텍스트를 이메일 헤더에 넣으므로 이제 헤더에는 추가 참조:, 숨은 참조: 및 받는 사람: 필드가 있습니다. 사용자가 제출 버튼을 클릭하면 이 이메일이 위의 모든 주소로 전송됩니다!
이메일 주입을 방지하는 가장 좋은 방법은 입력 내용을 확인하는 것입니다.
다음 코드는 이전 장의 코드와 유사하지만 여기에는 양식에서 이메일 필드를 감지하기 위한 입력 유효성 검사기를 추가했습니다.
<html><head><meta charset="utf-8"><title>코더 튜토리얼(codercto.com)</title></head><body><?phpfunction spamcheck($field){ // filter_var ( ) 이메일 필터링 // FILTER_SANITIZE_EMAIL 사용 $field=filter_var($field, FILTER_SANITIZE_EMAIL) //filter_var() 이메일 필터링 // FILTER_VALIDATE_EMAIL 사용 if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE }}if (isset($_REQUEST['email'])){ // 이메일 매개변수를 수신하면 이메일을 보냅니다. // 이메일이 합법적인지 확인 $mailcheck = spamcheck($_REQUEST['email']) if ($mailcheck==FALSE) { echo "잘못된 입력"; } else { // 이메일 보내기 $email = $_REQUEST['email'] ; $message = $_REQUEST[' message'] ; mail("[email protected]", "제목: $subject", $message, "보낸 사람: $email" ); for using our mail form"; }}else{ // email 매개변수가 없으면 양식을 표시합니다 echo "<form method='post' action='mailform.php'> Email: <input name='email' type ='text '><br> 제목: <input name='subject' type='text'><br> 메시지:<br> <textarea name='message' 행='15' cols='40'> </textarea><br> <input type='submit'> </form>";}?></body></html>
위 코드에서는 PHP 필터를 사용하여 입력의 유효성을 검사합니다.
FILTER_SANITIZE_EMAIL 필터는 문자열에서 이메일의 잘못된 문자를 제거합니다.
FILTER_VALIDATE_EMAIL 필터는 이메일 주소 값의 유효성을 검사합니다.
PHP 필터에서 필터에 대한 자세한 내용을 읽을 수 있습니다.