繁体   English   中英

当表单在 html 文档中编码时如何验证联系表单?

[英]How to validate contact form when form is coded in html document?

我有一个在 html 文档中写的联系表格,然后由外部 php 文件执行。 我如何验证它? 我看过的所有教程都在实际的 php 文件中显示了验证和 html 表单,那么我的验证如何完成?

HTML5:

<form id="form-area" action="email-processor.php" method="POST">
    <div id="name-area"><p>Name (required)</p><input class="form-input" type="text" name="name"></div>
    <div id="email-area"><p>Email (required)</p> <input class="form-input" type="text" name="email"></div>
    <div id="phone-area"><p>Telephone</p> <input class="form-input" type="text" name="phone"></div>
    <div id="msg-area"><p>Message</p><textarea id="msg-input" name="message" rows="6" cols="25"></textarea><br /></div>
    <input id="sendbtn" type="submit" value="Send">
</form>

PHP:

<?php 
    $name = $_POST['name'];
    $email = $_POST['email'];
    $phone = $_POST['phone'];
    $message = $_POST['message'];
    $formcontent="From: $name \n Phone Number: $phone \n \n Message: \n \n$message";
    $recipient = "sampleemail@hotmail.com"
    $subject = "Contact Form";
    $mailheader = "From: $email \r\n";

    mail($recipient, $subject, $formcontent, $mailheader) or die("Error!");
    echo "Thank You!";
?>

您需要将required放在输入字段后面。 如果您希望将电子邮件设为标准格式xxx@xxx.xxx而不是简单的文本,请使用 type="email"。 对于电话号码,您可以使用 type="number" 来仅允许数字,否则只需使用文本。

新的 HTML

 <form id="form-area" action="email-processor.php" method="POST"> <div id="name-area"><p>Name (required)</p><input type="text" class="form-input" type="text" name="name" required></div> <div id="email-area"><p>Email (required)</p> <input class="form-input" type="email" name="email" required></div> <div id="phone-area"><p>Telephone</p> <input class="form-input" type="number" name="phone" required></div> <div id="msg-area"><p>Message</p><textarea id="msg-input" name="message" rows="6" cols="25" required></textarea><br /></div> <input id="sendbtn" type="submit" value="Send"> </form>

正如已经指出的那样,对于客户端验证,您可以使用required属性,这将在大多数 Web 浏览器中触发外观更改。

但是,您还必须进行服务器端验证。 如果不这样做,将导致您的应用程序代码中出现漏洞。 例如,您的mail()调用当前允许对additional_headers参数进行未经处理的输入。 这意味着恶意行为者可以轻松地注入他们想要的任何标头 - 例如注入额外的To:CC:标头可以将您的服务器变成一个开放的邮件中继(即这很糟糕)。 攻击者总是在寻找 PHP mail()函数的错误用法,例如您的代码所展示的。

由于PHP mail()函数设计不佳,我的观点是没有人应该直接调用它。 该函数的正确使用实际上要复杂得多,因为它只是 sendmail 上的一个基本层,并且无需付出太多努力,就可以忽略管理电子邮件的各种 IETF RFC。 您应该使用诸如 Ultimate E-mail Toolkit、PHP Mailer 等库,它们在 mail() 和/或 SMTP 上提供更好的层来执行电子邮件的实际发送,并避免将您的服务器变成开放中继.

服务器是决定允许和不允许的最终权力。 出于这个原因,我使用 CubicleSoft FlexForms ,它帮助我生成 HTML 表单和处理用户输入服务器端。 你如何处理服务器端的事情比客户端验证重要得多,客户端验证可以而且将会被恶意用户忽略。 您无法控制客户端将发送的内容,并且存在大量恶意行为者。 因此,您必须做出不幸的假设,即所有用户都会攻击您的软件。 您应该始终从服务器端验证开始,然后添加客户端验证。

此外,您的代码不会像您预期的那样工作。 大多数邮件服务器都配置为拒绝欺骗尝试。 您不能假设您可以From:发送电子邮件From:您无法控制其电子邮件服务器的人。 消息会反弹,如果您发送足够多的欺骗邮件消息,您的服务器最终将被添加到全局黑名单(通过 DNSRBL)并拒绝向其他任何人发送电子邮件。 您只能向“发件人”发送一个您可以控制的地址,并且已经为其设置了 SPF 记录或 DMARC 等内容。 由于垃圾邮件发送者和互联网工程任务组 (IETF) 缺乏解决问题的指导,发送电子邮件变得困难。

但是,您可以将Reply-To:标题与您想要使用的任何经过清理的电子邮件地址一起使用。 大多数电子邮件客户端尊重 Reply-To 标头,并且在它存在时将使用它而不是 From 标头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM