在 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>

正如已经指出的那样,对于 client-side 验证,您可以使用 required 属性,这将触发大多数网络浏览器中的外观更改。

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

由于PHPmail()函数设计的不好,我的观点是大家不要直接调用。该函数实际上要正确使用要复杂得多,因为它只是 sendmail 的一个基本层,并且无需大量努力,就会忽略管理 e-mail 的各种 IETF RFC。您应该使用诸如 Ultimate E-mail Toolkit、PHP Mailer 等库,它们在 mail() and/or SMTP 上提供了一个更好的层来执行 e-mail 的实际发送] 并避免将您的服务器变成开放中继。

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

此外,您的代码无法按预期工作。大多数邮件服务器都配置为拒绝欺骗尝试。你不能假设你可以发送 e-mail From: 一个你无法控制其 e-mail 服务器的人。消息将被退回,如果您发送了足够多的欺骗性邮件消息,您的服务器最终将被添加到全球黑名单(通过 DNSRBL)并拒绝向其他任何人发送 e-mail。您只能发送 "From" 您可以控制并已为其设置 SPF 记录或 DMARC 等内容的地址。由于垃圾邮件发送者和互联网工程任务组 (IETF) 缺乏解决问题的方向,发送 e-mail 很困难。

但是,您可以将 Reply-To: header 与您想要使用的任何经过净化的 e-mail 地址一起使用。大多数 e-mail 客户尊重 Reply-To header 并将在它存在时使用它而不是 From header。