在上一节中的 PHP e-mail 脚本中,存在着一个漏洞。
首先,请看上一章中的 PHP 代码:
<html> |
<head> |
<meta charset="utf-8"> |
<title>芝麻教程(web3.xin)</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 |
防止 e-mail 注入的最好方法是对输入进行验证。
下面的代码与上一章中的类似,不过这里我们已经增加了检测表单中 email 字段的输入验证程序:
<html> |
<head> |
<meta charset="utf-8"> |
<title>芝麻教程(web3.xin)</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
中阅读更多关于过滤器的知识。