Php 是";带“U标签”;是否足以保证联系方式的安全?

Php 是";带“U标签”;是否足以保证联系方式的安全?,php,security,phpmailer,contact-form,Php,Security,Phpmailer,Contact Form,我的网站上有一个联系人表单,它将用户名、电子邮件地址、主题和消息的post值提交给一个使用phpmailer发送电子邮件的函数。使用带标签是否足以确保此表单安全?我还没有实现这个 function sendEmail($mail, $to, $subject, $senderName, $from, $message) { if((!empty($to)) && (!empty($subject)) && (!empty($senderName)) &am

我的网站上有一个联系人表单,它将用户名、电子邮件地址、主题和消息的post值提交给一个使用phpmailer发送电子邮件的函数。使用带标签是否足以确保此表单安全?我还没有实现这个

function sendEmail($mail, $to, $subject, $senderName, $from, $message) {
    if((!empty($to)) && (!empty($subject)) && (!empty($senderName)) && (!empty($from)) && (!empty($message))) {
        $mail->isSMTP();                                      // Set mailer to use SMTP
        $mail->Host = '[REDACTED]';  // Specify main and backup SMTP servers
        $mail->SMTPAuth = true;                               // Enable SMTP authentication
        $mail->Username = '[REDACTED]';                 // SMTP username
        $mail->Password = '[REDACTED]';                           // SMTP password
        $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
        $mail->Port = 587;                                    // TCP port to connect to

        $mail->setFrom($from, $senderName); //
        $mail->addAddress('[REDACTED]', '[REDACTED]');     // Add a recipient. Hardcoded email address
        $mail->addReplyTo($from, $senderName);

        $mail->Subject = $subject;
        $mail->Body    = "<h1>You've received a message through the contact form at chriscomposes.com</h1><br><br>" . $message;
        $mail->AltBody = "You've received a message through the contact form at chriscomposes.com." . $message;

        if(!$mail->send()) {
            return "<p style='margin-left: 5px; color: red;'>Message failed to send.</p>";
        } else {
            return "<p style='margin-left: 5px; color: green;'>Message has been sent.</p>";
        }   
    } else {
        return "<p style='margin-left: 5px; color: red;'>One or more fields are empty. Please enter a subject, name, email address, and message.</p>";
    }
} 
函数sendmail($mail、$to、$subject、$senderName、$from、$message){
如果((!empty($to))&&(!empty($subject))&&(!empty($senderName))&&(!empty($from))&&(!empty($message))){
$mail->isSMTP();//设置邮件程序以使用SMTP
$mail->Host='[redact]';//指定主SMTP服务器和备份SMTP服务器
$mail->SMTPAuth=true;//启用SMTP身份验证
$mail->Username='[redact]';//SMTP用户名
$mail->Password='[redact]';//SMTP密码
$mail->SMTPSecure='tls';//启用tls加密,也接受'ssl'
$mail->Port=587;//要连接的TCP端口
$mail->setFrom($from,$senderName)//
$mail->addAddress(“[redact]”,“[redact]”);//添加收件人。硬编码电子邮件地址
$mail->addReplyTo($from,$senderName);
$mail->Subject=$Subject;
$mail->Body=“您通过chriscomposes.com上的联系人表单收到了一条消息,

”$message; $mail->AltBody=“您通过chriscomposes.com上的联系表单收到了一条消息。”。$message; 如果(!$mail->send()){ 返回“

消息已发送。

”; } }否则{ return“

其中$contactEmail是从我的数据库中提取的地址。然后该函数使用phpmailer发送电子邮件地址。

您需要检查邮件,以确保没有向邮件头中注入收件人:、抄送人:、密件抄送人:,这将允许垃圾邮件发送者从您的表单中发送电子邮件


这篇文章还有其他信息:

PHP有一个名为
filter\u var
的数据过滤函数,您可以使用它来实现此功能

电子邮件地址、主题和正文都是用户输入的数据

$sanitizedEmail = filter_var($email, FILTER_SANITIZE_EMAIL);
$sanitizedSubject = filter_var($subject, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
$sanitizedBody = filter_val($body, FILTER_SANITIZE_STRING);
FILTER\u SANITIZE\u STRING
将删除标记并对特殊字符进行编码。

FILTER\u FLAG\u STRIP\u LOW
将删除换行符,因为您不需要主题字段中的换行符。

此外,您可以使用PHP函数清理每个输入:

<?php

 $name = filter_input(INPUT_POST, $_POST['name'], FILTER_SANITIZE_STRING);
 $email = filter_input(INPUT_POST, $_POST['email'], FILTER_SANITIZE_EMAIL);
 $address = filter_input(INPUT_POST, $_POST['address'], FILTER_SANITIZE_STRING);
 $message = filter_input(INPUT_POST, $_POST['message'], FILTER_SANITIZE_STRING);

?>

或者,您可以为args创建一个数组并通过所有验证:

<?php

$args = [
    'name'    => FILTER_SANITIZE_STRING,
    'email'   => FILTER_SANITIZE_EMAIL,
    'address' => FILTER_SANITIZE_STRING,
    'message' => FILTER_SANITIZE_STRING,
];

$myInputs = filter_input_array(INPUT_POST, $args);

?>

这是为了防止XSS攻击

此处显示所有类型的过滤器:

另外,作为额外提示,在清理每个“输入”后,您可以简化“空”检查,只使用“ISSET”(更快):



这意味着所有变量必须至少有一个字符,否则,代码将永远不会执行。

接收安全输入数据的最佳方法是为数据构建安全模型

我们应该定义哪些数据可以在表单中输入,以及系统需要接收哪些数据

基于这些知识,人们应该验证和过滤除真正需要的以外的一切

所以,如果您知道自己在做什么,那么您现在应该知道该函数、方法或更好的方法是否足以保护数据

人们不应该依赖简单的函数,而应该使用建模方法


另外,请阅读有关输入数据验证的更多信息。

我正在运行的函数不应允许此操作,它需要非常特定的变量,然后运行另一个函数来发送电子邮件。并且to地址在函数中是硬编码的。我想我最担心的是脚本攻击。尽管如此,我还是尝试了一个简单的测试,将“alert(1)”放入name字段并提交,但什么都没有发生(还没有使用strip_标记),所以可能根本不担心会有任何用户输入?你应该发布任何过滤消息的代码,你提到了strip_标签,但没有显示出来。我不知道有哪个电子邮件客户端运行javascript,所以XSS不适用,除非你也在“谢谢”页面上重新显示提交的内容。不要将提交人的电子邮件地址用作发件人的
地址,因为这会使您无法通过SPF检查;将其放在
回复
中。为什么要传入
$mail
实例?看起来最好将其作为本地静态变量,或者您需要小心在调用之间清除收件人。$mail变量不在函数范围内,如果您不传递邮件对象,它会引发服务器错误。谢谢你提醒我有关SPF检查的事。那真的很有用。从as设置是否有效webmaster@mydomain.com,和的名称,从mydomain.com开始。或者只需将电子邮件地址设置为webmaster@mydomain.com这个名字可以是发送信息的人的名字?太棒了。因此,这将保护网站和接收电子邮件的用户?基本上,这就像他们的名字所说的那样过滤,清理帖子或获取的输入。此筛选器可以删除额外的标记,并将变量转换为纯文本。
<?php
    if(isset($to{1}, $subject{1}, $senderName{1}, $from{1}, $message{1}))
    {
      //code...
    }
?>