php Secure email ,防止邮件注入

PHP Secure E-mails



在上一节中的 PHP e-mail 脚本中,存在着一个漏洞。


PHP E-mail 注入

首先,请看上一章中的 PHP 代码:

<html>
<head>
<meta charset="utf-8">
<title>测试教程(test.com)</title>
</head>
<body>

<?php
if (isset($_REQUEST[‘email‘])) { // 如果接收到邮箱参数则发送邮件
	// 发送邮件
	$email = $_REQUEST[‘email‘] ;
	$subject = $_REQUEST[‘subject‘] ;
	$message = $_REQUEST[‘message‘] ;
	mail("[email protected]", $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>

以上代码存在的问题是,未经授权的用户可通过输入表单在邮件头部插入数据。

假如用户在表单中的输入框内加入如下文本到电子邮件中,会出现什么情况呢?

[email protected]%0ACc:[email protected]
%0ABcc:[email protected],[email protected],
[email protected],[email protected]
%0ABTo:[email protected]

与往常一样,mail() 函数把上面的文本放入邮件头部,那么现在头部有了额外的 Cc:、Bcc: 和 To: 字段。当用户点击提交按钮时,这封 e-mail 会被发送到上面所有的地址!


PHP 防止 E-mail 注入

防止 e-mail 注入的最好方法是对输入进行验证。

下面的代码与上一章中的类似,不过这里我们已经增加了检测表单中 email 字段的输入验证程序:

<html>
<head>
<meta charset="utf-8">
<title>测试教程(test.com)</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("[email protected]", "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 过滤器验证电子邮件地址的值
时间: 2024-11-13 07:57:53

php Secure email ,防止邮件注入的相关文章

一起写框架-Ioc内核容器的实现-对象的调用[email&#160;protected]注解注入容器的对象(十二)

实现功能 现实需求中,有一些类似无法加入扫描组件注解的.如jdk里面的类. 那么框架必须要支持将没有组件注解标识的类也可以有一个方式注入到容器里面. 那么,我们通过类似Spring的@Bean的方案,来实现这个需求. 通过在配置类的方法的上面,使用@Bean注解,将返回的对象加到容器中. 实现思路 获得有@Configuration注解标识的类.检索它的方法,如果有@Bean,执行这个方法并将返回的对象放在容器中. 实现步骤 1.定义一个Bean注解 1 package ioc.core.ann

使用邮件模板(freemarker.jar)发送邮件

1.把freemarker.jar架包添加到项目中 2.创建模板文件,以*.ftl(后缀名是ftl)命名,模板示例如下 1 <html> 2 <head> 3 <meta http-equiv="content-type" content="text/html;charset=utf-8"> 4 </head> 5 <body> 6 <font color="blue" size=

使用Spring整合javaMail发用邮件

1.导入javamail.jar        自行百度下载 2.使用模板发送邮件架包 freemarker.jar 3.Spring配置文件  以及架包这里就不需要说了吧,如果不明白的发我Email :[email protected] //邮件信息设置类 main.java package cn.jbit.email; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.ut

在 OS X 上使用 S/MIME 加密和签名邮件

邮件安全尤其值得关注,我已经不止一次见到过对邮件泄漏,篡改或者伪造的抱怨,比如: . 不管你是什么职业,学会使用加密邮件,并对邮件进行数字签名从而保证你的邮件不被接收者之外的人读取或恶意篡改,是每个人应该掌握的技能.这篇文章介绍了在 OS X 上使用 S/MIME 证书对你的邮件进行加密(encrypt)和数字签名(digital signing),相较于使用 GnuPG 收发加密邮件而言,使用 S/MIME 证书对邮件进行加密和签名要更加轻量级,对 GnuPG 的支持还要额外安装插件.此外,移

跟bWAPP学WEB安全(PHP代码)--邮件头和LDAP注入

背景 由于时间限制和这俩漏洞也不是特别常用,在这里就不搭建环境了,我们从注入原来和代码审计的角度来看看. 邮件头注入 注入原理: 这个地方首先要说一下邮件的结构,分为信封(MAIL FROM.RCPT TO).头部(From,To,Subject.CC.BCC等).主体(message),所谓的邮件头注入,其实就是针对头部的部分.使用telnet对25端口进行手工发邮件的过程的事后会发现,对于邮件头部的字段其实就是换行符0x0A或者0x0D0x0A分割 ,在绝大部分系统里面不是\n 就是\r\n

Linux发邮件之mail

1.安装 (需要sendmail或postfix服务) sendmail     # yum install sendmail      # systemctl start sendmail.service     # systemctl status sendmail.service postfix     # yum install mailx     # systemctl start postfix.service     # systemctl status postfix.servi

PHP中利用PHPMailer配合QQ邮箱实现发邮件

由于项目的需要,要实现给我们的网站用户发送邮件,于是就有了这篇博客.以下的内容是我结合网上的例子加上自己的实践的出来的.希望对大家有帮助. PHPMailer的介绍: 优点: 可运行在任何平台之上 支持SMTP验证 发送邮时指定多个收件人,抄送地址,暗送地址和回复地址:注:添加抄送.暗送仅win平台下smtp方式支持 支持多种邮件编码包括:8bit,base64,binary和quoted-printable 支持冗余SMTP服务器,即可以指定主smtp服务器地址也只可以指定备份smtp服务器

JavaMail 邮件发送之使用qq邮箱

所需jar包:comment-email.jar     mail.jaractivation.jar 一. 配置QQ邮箱的IMAP 进入qq电子邮件点击 设置->账户里开启 SMTP 服务(开启IMAP/SMTP服务)   注意:在启用QQ邮箱的14天之后才能开启此服务 开启之后会得到授权码,此授权码要记住或者保存到文本文件当中发送邮件的时候需要作为验证密码使用. 二.使用JavaMail发送一封简单邮件 的示例代码: public static void main(String[] args

Sina App Engine(SAE)入门教程(9)- SaeMail(邮件)使用

参考资料: SAE mail api 文档 怎么使用? 参见代码: <?php $mail = new SaeMail(); $f = new SaeFetchurl(); $img_data = $f->fetch( 'http://ss7.sinaimg.cn/bmiddle/488efcbbt7b5c4ae51ca6&690' ); $mail->setAttach( array( 'my_photo' => $img_data ) ); $ret = $mail-&