PHP E-mail

PHP E-mail 注入

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

<html>
<body>

<?php
if (isset($_REQUEST[‘email‘]))
//if "email" is filled out, send email
{
//send email
$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
//if "email" is not filled out, display the form
{
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>
<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[‘email‘]))
{//if "email" is filled out, proceed

//check if the email address is invalid
$mailcheck = spamcheck($_REQUEST[‘email‘]);
if ($mailcheck==FALSE)
{
echo "Invalid input";
}
else
{//send email
$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
{//if "email" is not filled out, display the form
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 Filter 中阅读更多关于过滤器的知识。

时间: 05-29

PHP E-mail的相关文章

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

linux mail 命令参数

使用mail发邮件时,必须先将sendmail服务启动. mail –s “邮件主题” –c”抄送地址” –b “密送地址” -- -f 发送人邮件地址 –F 发件人姓名 < 要发送的邮件内容 三种常用格式发信    mail -s test [email protected]                         #第一种方法,你可以把当前shell当成编辑器来用,编辑完内容后Ctrl-D结束    echo “mail content”|mail -s test [email pr

Java Mail发送

package com.xuo.jms; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMess

#22 系统进程调度、at、batch、mail、crontab

Linux系统的进程调度(任务调度) 进度调度:在未来某个时间点,让系统自动执行我们事先编写好的命令或脚本的列表,从而使得即使用户不在计算机旁边也可以按时完成任务: 为了能够进行进程调度,就必须要有一种机制能够识别事件发生的时间并且能够运行用户所预期的命令:这种机制在Linux中是通过特定的守护进程来实现的: 这类守护进程包括: atd: 将预先编写好的命令在未来某个时间点执行一次: crond: 将预先编写好的命令在未来的符合条件的时间点重复执行: 查看此类守护进程是否正常运行: centos

System.net.mail 腾讯ssl发送邮件超时

我采用了.net 的自带组件 System.Web.Mail.MailMessage发送邮件,主要是在客户注册网站成功的时候发条欢迎邮件,最近邮件无法发送了,看了下腾讯smtp邮件配置,所有的邮件发送都换成ssl了,之前用的是25端口,现在换成了465或587,于是修改代码如下: MailMessage msgMail = new MailMessage("发件箱", "收件箱", "邮件标题", "邮件内容",2); Smt

zabbix使用系统自带mailx(mail)SMTP发送邮件

0x01,环境介绍: 我们用的是微软的邮箱打算用SMTP方式发送邮件.先登录账户看官方给出SMTP信息. 0x02,系统mailx(mail)设置. 通过命令可以看到,mail实际上是mailx的快捷方式.然后在/etc/mail.rc里加入账号等信息. SMTP加密方式是:STARTTLS set from=Zabbix使用的发送邮件地址 set smtp=smtp.office365.com set smtp-auth-user=Zabbix使用的发送邮件地址 set smtp-auth-p

com.sun.mail.smtp.SMTPSendFailedException: 553 Mail from must equal authorized user

1.错误描写叙述 553 Mail from must equal authorized user com.sun.mail.smtp.SMTPSendFailedException: 553 Mail from must equal authorized user at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1333) at com.sun.mail.smtp.SMTPTransport.mail

使用mail.rc快速配置linux发邮件服务

1.系统环境. [[email protected] ~]# cat /etc/redhat-release  CentOS release 6.8 (Final) [[email protected] ~]# uname -r 2.6.32-642.el6.x86_64 [[email protected] ~]# uname -m x86_64 2.通过修改配置文件/etc/mail.rc可以使用外部SMTP服务器,轻松实现linux发邮件功能. [[email protected] ~]#

使用java mail 发送邮件

1.关联jar包:   activation.jar   mail.jar 2.调用 @Test public void test1() { List<String> imageUrlList = Arrays.asList(new String[] { "src/美女1.jpg", "src/2.jpg", "src/2.jpg" }); List<String> attachmentUrlList = Arrays.a

三.mail 接收权限 dovecot加密通信 php数据库 thunderbird

postconf -d:查看默认设置postconf -n:查看当前设置postconf -e "inet_interfaces = all":修改选项inet_interfaces 参数指定postfix系统监听的网络接口. 一.邮件的限制==access==   ##禁止某个ip接受邮件[[email protected] ~]# cd /etc/postfix/[[email protected] postfix]# lsaccess     generic        mai