validar formulario desde servidor en PHP / Textarea

Iniciado por guiamoscow, 29 Diciembre 2018, 19:03 PM

0 Miembros y 1 Visitante están viendo este tema.

guiamoscow

Buenas tardes amigos y felices fiestas.
Antes que nada quiero agradecerles por la pagina es muy buena y brinda mucha información.
No encontré mi problema en los foros por eso escribo mi pregunta aquí a ver si hayo respuesta.

Necesito validar el textarea de mi formulario, que rechace escritura de url y palabras mal sonantes como sex, porn, etc..

Por favor si me pueden dar una mano estaré muy agradecido.

Envío los codigos de formulario del php

Código del formulario
form.html

Código (html5) [Seleccionar]
<html>
   <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head>
   <body>
       <form accept-charset="UTF-8" action="https://excursiones-moscu-espanol.com/validation-send.php" method="post" target="_blank" autocomplete="off">
   <div style="width: 300px;margin: auto;border:1px solid #ddd;padding: 40px;">
<label for="fname"><b>¿Para qué día desea el tour?</b></label><br>
<input type="date" name="fecha" required><br>
<br>
<label for="fname"><b>Su nombre</b></label><br>
<input type="text" id="fname" name="nombre" placeholder="Su nombre.." required><br><br>
<label for="lname"><b>Su Email</b></label><br>
<input type="email" id="email" name="email" placeholder="Su email.." pattern="[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*@[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{1,5}" required><br><br>
<label for="country"><b>¿Desde dónde nos escribes?</b></label><br>
<select id="country" name="pais">
<option value="Argentina">Argentina</option>
<option value="Bolivia">Bolivia</option>
<option value="Brasil">Brasil</option>
<option value="Chile">Chile</option>
<option value="Colombia">Colombia</option>
<option value="Costa Rica">Costa Rica</option>
<option value="Cuba">Cuba</option>
<option value="Ecuador">Ecuador</option>
<option value="El Salvador">El Salvador</option>
<option value="España">España</option>
<option value="Guatemala">Guatemala</option>
<option value="Honduras">Honduras</option>
<option value="México">México</option>
<option value="Nicaragua">Nicaragua</option>
<option value="Paraguay">Paraguay</option>
<option value="Panamá">Panamá</option>
<option value="Perú">Perú</option>
<option value="Puerto Rico">Puerto Rico</option>
<option value="República Dominicana">República Dominicana</option>
<option value="Uruguay">Uruguay</option>
<option value="Venezuela">Venezuela</option>
<option value="Estados Unidos">Estados Unidos</option>
<option value="Otro">Otro..</option>
</select><br><br>
<label for="country"><b>¿Cuantas personas serán?</b></label><br>
<select id="country" name="personas">
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="Mas22">Más de 22</option>
</select><br><br>
<label for="subject"><b>Su consulta</b></label><br>
<textarea id="subject" name="mensaje" placeholder="Escribe tu mensaje.." style="height:200px" required></textarea><br><br>
<input type="submit" value="Enviar consulta">
</div>
</form>
</body>
</html>


Codigo del PHP
validation-send.php

Código (php) [Seleccionar]
<?php
function get_ip_address() {
if (!empty(
$_SERVER['HTTP_CLIENT_IP'])) {
$ip $_SERVER['HTTP_CLIENT_IP'];
} else {
    if (!empty(
$_SERVER['HTTP_X_FORWARDED_FOR'])) {
    
$ip $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    
$ip $_SERVER['REMOTE_ADDR'];
}}
return 
$ip;
}
function 
check_input($data)
 {
    
$data trim($data);
    
$data stripslashes($data);
    
$data htmlspecialchars($data);
    return 
$data;
 }
 if (
$_POST['nospam'] != ""){
 
// Es un SPAMbot
 
exit("Imposible enviar la solicitud, cierre la ventana.");
} else {
 
// Es un usuario real, proceder a enviar el formulario.
}

 
$destino "......";
 
$fecha check_input($_POST['fecha']);
 
$nombre check_input($_POST['nombre']);
 
$email check_input($_POST['email']);
 
$pais check_input($_POST['pais']);
 
$personas check_input($_POST['personas']);
 
$mensaje check_input($_POST['mensaje']);
 
$ip   ' '.get_ip_address();
 
$cont "Enviado desde:\n https://guiamoscow.es.tl/Excursiones-Moscu-verano-2011.htm";
 
$headers .= "Content-Type: text/html; charset = UTF-8 \n";
 
$contenido "CONSULTA: Moscú 1 día
 IP:" 
$ip "\n

 Su nombre:\n " 
$nombre "\n
 Su email:\n " 
$email "\n
 Para qué fecha:\n " 
$fecha "\n
 Desde donde nos escribes:\n " 
$pais "\n
 Cuantas personas son?:\n " 
$personas "\n
 Mensaje del turista:\n " 
$mensaje;
 
 
mail($destino,"Consulta"$contenido$cont);
 
header("Location:https://guiamoscow.es.tl/muchas-gracias.htm");
 
?>

febef

Buenas

Me agarraste de con buena onda  :xD

Leete esto sobre regex en php,

visita esta pagina→ http://php.net/manual/es/function.preg-match-all.php

y desp usa este→ https://www.phpliveregex.com/p/qxq (con la función preg_match_all)


De manera que quede tu código:

Código (php) [Seleccionar]

   preg_match_all('/[a-z]+:\/\/\S+|sex|porn/', $input_texarea, $output_array)

   if (count ($output_array) > 0) {
      echo "se encontraron cadenas no permitidas";
   }



Saludos!

chatiel

Hola guiamoscow

Lo que nuestro amigo febef quiere decir es que con la funcion "preg_match_all" o "str_replace" lo que puedes hacer es simplemente cambiar el texto por un espacio vacio.

Acá te dejo el código para que lo pongas DEBAJO de la linea "$mensaje = check_input($_POST['mensaje']);"
Esta es una opción que yo la llamé filtro.
<?php
$buscar
= array("sex""porn""violencia");
$reemplazar= array("""po..""violenc");
$mensaje str_replace($buscar$reemplazar$mensaje);
//by chatiel
?>


Otra opción es:
<?php
$buscar
= array("sex""porn""violencia");
$mensaje str_replace($buscar""$mensaje);
//by chatiel
?>


Adicionales:
Te recomiendo quitar el siguiente texto del primer archivo
pattern="[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*@[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{1,5}"
En HTML5 el input type="email" por defecto detecta la correcta escritura de correos.
Otra observación es que la etiqueta "<b>" es de xhtml 1.0 ahora para negritas es la etiqueta <strong>

espero que te sirva.

Suerte bro.

#!drvy

Hola,

Tu HTML tiene varios errores..

- Como ya ha comentado el compañero @chatiel, el pattern que tienes es inútil si usas un campo tipo email.
- Tienes varios nombres e ids que no corresponden con el for del label.
- Intenta no utilizar inline CSS, es feo y una mala practica (úsalo solo cuando no te queda otra).
- En vez de utilizar breaks (<br>) para espaciar, usa un div u otro contenedor.
- Si todos los label son en negrita, usa CSS para decirles que se muestren en una linea negrita.
- No deshabilites el autocomplete a no ser que tengas una razón de peso.


El PHP lo mismo:

- No te fíes de HTTP_CLIENT_IP ni de X_FORWARDED_FOR. Son simples cabeceras las cuales el cliente puede modificar desde su navegador.

- En el check_data realmente no estas comprobando nada (check..) si no que estas devolviendo un valor filtrado.

- No pones la lógica del envió del correo en el IF "anti-spam"...

- Realmente en ningún momento validas nada.


Con todo esto, me da que lo que has hecho es un copy-paste barato de algún lado...Los compañeros te han dado algunos ejemplos de como puedes buscar palabras malsonantes.. con una URL seguirías con el mismo principio..  pero.. ¿realmente necesitas eso? Por lo que veo, vas a enviar un correo sobre una consulta de viaje (probablemente a una agencia de viaje), no lo vas a exponer de manera publica ni nada parecido. Hay infinitas formas de saltarse los filtros: en vez de cabron pongo cab.ron por ejemplo, o, en vez de http://google.com pongo h t t p : / / google (punto) com... No tiene mucho sentido si no vas a exponerlo al publico.

Saludos


chatiel

Excelente bro!
No pensé que exista otro enfermo como yo en SEO  ;-)