Php 是";带“U标签”;是否足以保证联系方式的安全?
我的网站上有一个联系人表单,它将用户名、电子邮件地址、主题和消息的post值提交给一个使用phpmailer发送电子邮件的函数。使用带标签是否足以确保此表单安全?我还没有实现这个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
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...
}
?>