我对编码还很陌生,我正在使用PHP建立联系表格。我已包括必须检查的reCaptcha。如果用户填写表格,然后按提交按钮,而不检查reCaptcha。 表单将重置,用户将不得不再次填写所有内容。
当未选中reCaptcha并提交表单时,如何保留输入?
我在这里发现要使用htmlspecialchars。确实可以通过替换html字符来工作,但是如果用户使用引号或<>,则用户仍然必须再次填写。
关于XSS或SQL注入安全措施或可能使用AJAX的任何建议都很棒。
\par
这是我拥有PHP的方式
<label for="message"> Message:</label>
<textarea class="form-control" type="textarea" id="message"
name="message" maxlength="6000" rows="5" value="<?php echo
htmlspecialchars($message); ?>" required ></textarea>
```
if(filter_has_var(INPUT_POST, 'submit'))
{
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
$message = htmlspecialchars($_POST['message']);
$phone = $_POST['phone'];
$mail = new PHPMailer;
// Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->SMTPDebug = 0;
$mail->Host = 'smtp.gmail.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = EMAIL; // SMTP username
$mail->Password = PASS; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
$mail->setFrom($email, $name);
$mail->addAddress('mail.com', 'Joe User'); // Add a recipient
// Name is optional
$mail->addReplyTo($email); // Optional name
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = 'Client Contact Email';
$mail->Body = '<h2>Contact Request</h2>
<h4>Name</h4><p>'.$name.'</p>
<h4>Email</h4><p>'.$email.'</p>
<h4>Message</h4><p>'.$message.'</p>
<h4>Phone</h4><p>'.$phone.'</p>';
答案 0 :(得分:1)
首先,您可以在表单提交过程中在javascript方面进行一些基本的表单有效性测试。例如,如果必填字段为空白,则可以return false;
-这将停止提交过程并将控制权返回给用户。
专门针对Google Recaptcha,Google在检查表单时添加了一个回调选项。 See this answer了解实施方法。
但是,更安全的字段验证必须在PHP方面进行(精明的用户使用DevTools可以伪造javascript验证并提交表单)。如果任何字段都无法通过PHP验证,则只有一个选择:将表单数据发送回页面并重建用户输入。
Here is an example(在javascript端进行简单表单验证),供您参考。
参考文献:
Add a callback to Google recaptcha to check if user checked the box
MDN article on form validation - note the SmashingMagazine links at bottom
TutorialsPoint - more concise example of the same