>백엔드 개발 >PHP 튜토리얼 >PHP 보안 이메일

PHP 보안 이메일

黄舟
黄舟원래의
2016-12-28 09:34:442367검색

이전 섹션의 PHP 이메일 스크립트에는 취약점이 있습니다.

PHP 이메일 삽입

먼저 이전 장의 PHP 코드를 살펴보세요.

<html>
<body>

<?php
if (isset($_REQUEST[&#39;email&#39;]))
//if "email" is filled out, send email
{
//send email
$email = $_REQUEST[&#39;email&#39;] ;
$subject = $_REQUEST[&#39;subject&#39;] ;
$message = $_REQUEST[&#39;message&#39;] ;
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=&#39;post&#39; action=&#39;mailform.php&#39;>
Email: <input name=&#39;email&#39; type=&#39;text&#39;><br>
Subject: <input name=&#39;subject&#39; type=&#39;text&#39;><br>
Message:<br>
<textarea name=&#39;message&#39; rows=&#39;15&#39; cols=&#39;40&#39;>
</textarea><br>
<input type=&#39;submit&#39;>
</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[&#39;email&#39;]))
{//if "email" is filled out, proceed

//check if the email address is invalid
$mailcheck = spamcheck($_REQUEST[&#39;email&#39;]);
if ($mailcheck==FALSE)
{
echo "Invalid input";
}
else
{//send email
$email = $_REQUEST[&#39;email&#39;] ;
$subject = $_REQUEST[&#39;subject&#39;] ;
$message = $_REQUEST[&#39;message&#39;] ;
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=&#39;post&#39; action=&#39;mailform.php&#39;>
Email: <input name=&#39;email&#39; type=&#39;text&#39;><br>
Subject: <input name=&#39;subject&#39; type=&#39;text&#39;><br>
Message:<br>
<textarea name=&#39;message&#39; rows=&#39;15&#39; cols=&#39;40&#39;>
</textarea><br>
<input type=&#39;submit&#39;>
</form>";
}
?>

</body>
</html>

위 코드에서, 입력을 검증하는 데 PHP 필터가 사용됩니다.

FILTER_SANITIZE_EMAIL 필터는 문자열에서 이메일의 잘못된 문자를 제거합니다.

FILTER_VALIDATE_EMAIL 필터는 이메일 주소 값의 유효성을 검사합니다.

위 내용은 다음과 같습니다. PHP 보안 이메일 내용에 대한 자세한 내용은 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:PHP JSON다음 기사:PHP JSON