PHP 개발 기본 튜토리얼:...LOGIN

PHP 개발 기본 튜토리얼: 보안 이메일

1. PHP 이메일 삽입

PHP 이메일 스크립트에 보안 취약점이 있습니다

이전 보기 챕터에 하나의 PHP 코드:

<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>

<?php
if (isset($_REQUEST['email'])) { // 如果接收到邮箱参数则发送邮件
	// 发送邮件
	$email = $_REQUEST['email'] ;
	$subject = $_REQUEST['subject'] ;
	$message = $_REQUEST['message'] ;
	mail("someone@example.com", $subject,
	$message, "From:" . $email);
	echo "邮件发送成功";
} else { // 如果没有邮箱参数则显示表单
	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() 함수는 위의 텍스트를 이메일 헤더에 넣으므로 이제 헤더에는 추가 항목이 있습니다. 참조:, 숨은 참조: 및 받는 사람: 필드가 추가되었습니다. 사용자가 제출 버튼을 클릭하면 이 이메일이 위의 모든 주소로 전송됩니다!


2. PHP 이메일 인젝션

이메일 인젝션을 방지하는 가장 좋은 방법은 입력 내용을 검증하는 것입니다. (양식 유효성 검사와 유사)

다음 코드는 이전 장의 코드와 유사하지만 여기에는 양식의 이메일 필드를 감지하는 입력 유효성 검사기를 추가했습니다:

<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>
<?php
function spamcheck($field)
{
// filter_var() 过滤 e-mail
// 使用 FILTER_SANITIZE_EMAIL
$field=filter_var($field, FILTER_SANITIZE_EMAIL);
 
//filter_var() 过滤 e-mail
// 使用 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'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
mail("someone@example.com", "Subject: $subject",
$message, "From: $email" );
echo "Thank you for using our mail form";
}
}
else
{
// 如果没有邮箱参数则显示表单
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 필터는 이메일 주소 값의 유효성을 검사합니다.

필터에 대한 자세한 내용은 PHP에서 확인할 수 있습니다. 필터.


다음 섹션
<html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> </head> <body> <?php if (isset($_REQUEST['email'])) { // 如果接收到邮箱参数则发送邮件 // 发送邮件 $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("someone@example.com", $subject, $message, "From:" . $email); echo "邮件发送成功"; } else { // 如果没有邮箱参数则显示表单 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>
코스웨어