我正在同一页面上开发一个联系表单,并在使用PHP提交时隐藏表单,但是在按下提交按钮时验证验证码图像时遇到问题,它在提交时将两条消息一起显示:
字符与验证码不匹配。
感谢您的意见。
通过这段代码我得到了图片的验证码值。
if($_SESSION['vcode'] != $_POST['vcode']) {}
由于验证验证码的问题,我怀疑在哪里使用PHP 验证表单数据。
更新
联系表格.php
<!DOCTYPE html>
<html>
<head>
<title>Formulario de Contacto</title>
</head>
<body>
<?php
// Función para validar contra cualquier intento de inyección de correo electrónico
function IsInjected($str) {
$injections = array('(\n+)',
'(\r+)',
'(\t+)',
'(%0A+)',
'(%0D+)',
'(%08+)',
'(%09+)'
);
$inject = join('|', $injections);
$inject = "/$inject/i";
if(preg_match($inject,$str)) {
return true;
}else{
return false;
}
}
?>
<?php
session_start();
$errors = '';
$nombre = '';
$email = '';
$telefono = '';
$mensaje = '';
if(isset($_POST['submit'])) {
if($_SESSION['vcode'] != $_POST['vcode']) {
$errors .= "Los caracteres no coincide con el código captcha";
}
$nombre = $_POST["name"];
$email = $_POST["mail"];
$telefono = $_POST["phone"];
$mensaje = $_POST["message"];
if(empty($nombre)) {
$errors .= "\n Por favor ingresar su nombre. ";
}
if(empty($email)) {
$errors .= "\n Por favor ingresar su email. ";
}elseif (IsInjected($email)) {
$errors .= "\n email no valido. ";
}
if(empty($telefono)) {
$errors .= "\n Por favor ingresar su numero telefono. ";
}
if($_POST['producto'] == 0){
$errors .= "\n Debe seleccionar un producto";
}
if(empty($mensaje)) {
$errors .= "\n Por favor ingresar su mensaje. ";
}
if(empty($errors)) {
$asunto = "";
$message = "Usuario:".$_POST['name']." Email:".$_POST['mail']." Telefono ".$_POST['phone']." Informacion ".$_POST['message'];
$destino = "[email protected]";
$remitente = "From: [email protected]";
mail($destino,$asunto,$message,$remitente);
unset($_POST['submit']);
echo "Gracias por sus comentarios";
}
}else{
?>
<div class="error">
<?php
if(!empty($errors)){
echo "<p class='err'>".nl2br($errors)."</p>";
}
?>
</div>
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post" autocomplete="off" enctype="multipart/form-data">
<div class="touch">
<div class="name">
<input type="text" name="name" placeholder="Nombre" value='<?php echo htmlentities($nombre) ?>'>
</div>
<div class="email">
<input type="text" name="mail" placeholder="Email" value='<?php echo htmlentities($email) ?>'>
</div>
<div class="phone">
<input type="text" name="phone" placeholder="Phone" value='<?php echo htmlentities($telefono) ?>'>
</div>
<div class="select-pro">
<select name="producto">
<option value="0" selected>Asunto...</option>
<option value="1">Producto 1</option>
<option value="2">Producto 2<option>
<option value="3">Producto 3</option>
<option value="4">Otro</option>
</select>
</div>
<div class="Customer-message">
<textarea id="message" name="message" placeholder="Su consulta..."><?php echo htmlentities($mensaje) ?></textarea>
</div>
<div class="capcha">
<img src="image.php" name="vcode" id="phoca-captcha"/>
<input name="vcode" type="text" placeholder="Codigo captcha">
</div>
<input type="submit" name="submit" value="Enviar">
</div>
</form>
<?php } ?>
</body>
</html>
期望的事情是在发送时隐藏表单并显示以下消息谢谢您的评论但是当发送空白或正确或错误填写的字段时,附加表单被隐藏,字段验证丢失,因为它没有不显示错误信息。
另一个错误是验证任何电子邮件注入尝试的功能,输入无效电子邮件示例(false@aasadw)不会显示错误消息:无效电子邮件。
为了防止用户因未正确输入验证码字符而丢失表单字段中给出的信息,我在每个字段中添加了此操作:
value='<?php echo htmlentities($nombre) ?>'
但是select -> option
如何避免在发送时丢失产品选择。
在继续之前,在w3schools 的w3schools中进行分析、学习和实践之前,您会 找到一份完整的指南,其中包含简单实用的示例,对您有很大帮助。
关注表单的安全性对于避免跨站点脚本 (XSS) 攻击至关重要,这些攻击执行的命令可以将用户重定向到另一台服务器上的文件,并且该文件可能包含可以更改全局变量或将表单发送到另一个服务器的恶意代码保存用户数据的地址。
因此,您所做的很重要,但值得强调的是,以满足其他用户可能有的任何疑问。
易受攻击(黑客可以使用此操作!)跨站点脚本 (XSS) 攻击。
安全行动表格
htmlspecialchars
(重要的是您在表格中实施的内容)。任何对黑客攻击的操纵:
使用该函数
htmlspecialchars ()
将特殊字符转换为 HTML 实体。现在,如果用户尝试利用变量PHP_SELF
,结果将是以下结果:但是,如果没有该功能
htmlspecialchars ()
,结果将不同于无害攻击的示例。您可以添加一个函数和另一个参数来进一步增强安全性,如下所示:
确认电邮
检查电子邮件地址是否格式正确的最简单和最安全的方法是使用 PHP 函数
filter_var ()
。您还可以通过这种简单的方式验证名称,以检查名称字段是否仅包含字母和空格。
验证电话号码
在此验证中,接受来自所有国家/地区的 10 位或更多数字,包括其验证示例中的国家/地区代码:+1 xxx xxx xxx。
如果您想退出特定的电话号码,您必须更改:
想要什么。
关于提交时隐藏联系表单,您应该将消息更改为变量。
改变这个:
为了这:
替换这个:
为了这:
为避免从选项中丢失对产品的选择,请在找到其余数据的位置添加此参数
$telefono, $nombre
$seleccionado = '';
现在为了避免错误还在上面添加以下变量if(isset($_POST['submit']))
替换
select
纯HTML。使用PHP 进行动态选择。(这样选择的数据不会丢失)
重要的是要知道,验证码是在用户尝试提交表单一定次数时出现还是一直存在?
如果它总是在那里,那么它就是您表单的另一个字段,并且代码将保持原样,除了它会创建一个标志变量
$error
并将$mensaje
其添加name
到您的选择器