Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: guiamoscow en 29 Diciembre 2018, 19:03 pm



Título: validar formulario desde servidor en PHP / Textarea
Publicado por: guiamoscow en 29 Diciembre 2018, 19:03 pm
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
  1.    <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head>
  2.    <body>
  3.        <form accept-charset="UTF-8" action="https://excursiones-moscu-espanol.com/validation-send.php" method="post" target="_blank" autocomplete="off">
  4.    <div style="width: 300px;margin: auto;border:1px solid #ddd;padding: 40px;">
  5. <label for="fname"><b>¿Para qué día desea el tour?</b></label><br>
  6. <input type="date" name="fecha" required><br>
  7. <br>
  8. <label for="fname"><b>Su nombre</b></label><br>
  9. <input type="text" id="fname" name="nombre" placeholder="Su nombre.." required><br><br>
  10. <label for="lname"><b>Su Email</b></label><br>
  11. <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>
  12. <label for="country"><b>¿Desde dónde nos escribes?</b></label><br>
  13. <select id="country" name="pais">
  14. <option value="Argentina">Argentina</option>
  15. <option value="Bolivia">Bolivia</option>
  16. <option value="Brasil">Brasil</option>
  17. <option value="Chile">Chile</option>
  18. <option value="Colombia">Colombia</option>
  19. <option value="Costa Rica">Costa Rica</option>
  20. <option value="Cuba">Cuba</option>
  21. <option value="Ecuador">Ecuador</option>
  22. <option value="El Salvador">El Salvador</option>
  23. <option value="España">España</option>
  24. <option value="Guatemala">Guatemala</option>
  25. <option value="Honduras">Honduras</option>
  26. <option value="México">México</option>
  27. <option value="Nicaragua">Nicaragua</option>
  28. <option value="Paraguay">Paraguay</option>
  29. <option value="Panamá">Panamá</option>
  30. <option value="Perú">Perú</option>
  31. <option value="Puerto Rico">Puerto Rico</option>
  32. <option value="República Dominicana">República Dominicana</option>
  33. <option value="Uruguay">Uruguay</option>
  34. <option value="Venezuela">Venezuela</option>
  35. <option value="Estados Unidos">Estados Unidos</option>
  36. <option value="Otro">Otro..</option>
  37. </select><br><br>
  38. <label for="country"><b>¿Cuantas personas serán?</b></label><br>
  39. <select id="country" name="personas">
  40. <option value="2">2</option>
  41. <option value="3">3</option>
  42. <option value="4">4</option>
  43. <option value="5">5</option>
  44. <option value="6">6</option>
  45. <option value="7">7</option>
  46. <option value="8">8</option>
  47. <option value="9">9</option>
  48. <option value="10">10</option>
  49. <option value="11">11</option>
  50. <option value="12">12</option>
  51. <option value="13">13</option>
  52. <option value="14">14</option>
  53. <option value="15">15</option>
  54. <option value="16">16</option>
  55. <option value="17">17</option>
  56. <option value="18">18</option>
  57. <option value="19">19</option>
  58. <option value="20">20</option>
  59. <option value="21">21</option>
  60. <option value="Mas22">Más de 22</option>
  61. </select><br><br>
  62. <label for="subject"><b>Su consulta</b></label><br>
  63. <textarea id="subject" name="mensaje" placeholder="Escribe tu mensaje.." style="height:200px" required></textarea><br><br>
  64. <input type="submit" value="Enviar consulta">
  65. </div>
  66. </form>
  67. </body>
  68. </html>

Codigo del PHP
validation-send.php

Código
  1. <?php
  2. function get_ip_address() {
  3. if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
  4. $ip = $_SERVER['HTTP_CLIENT_IP'];
  5. } else {
  6.    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  7.    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  8. } else {
  9.    $ip = $_SERVER['REMOTE_ADDR'];
  10. }}
  11. return $ip;
  12. }
  13. function check_input($data)
  14. {
  15.    $data = trim($data);
  16.    $data = stripslashes($data);
  17.    $data = htmlspecialchars($data);
  18.    return $data;
  19. }
  20. if ($_POST['nospam'] != ""){
  21. // Es un SPAMbot
  22. exit("Imposible enviar la solicitud, cierre la ventana.");
  23. } else {
  24. // Es un usuario real, proceder a enviar el formulario.
  25. }
  26.  
  27. $destino = "......";
  28. $fecha = check_input($_POST['fecha']);
  29. $nombre = check_input($_POST['nombre']);
  30. $email = check_input($_POST['email']);
  31. $pais = check_input($_POST['pais']);
  32. $personas = check_input($_POST['personas']);
  33. $mensaje = check_input($_POST['mensaje']);
  34. $ip   = ' '.get_ip_address();
  35. $cont = "Enviado desde:\n https://guiamoscow.es.tl/Excursiones-Moscu-verano-2011.htm";
  36. $headers .= "Content-Type: text/html; charset = UTF-8 \n";
  37. $contenido = "CONSULTA: Moscú 1 día
  38. IP:" . $ip . "\n
  39.  
  40. Su nombre:\n " . $nombre . "\n
  41. Su email:\n " . $email . "\n
  42. Para qué fecha:\n " . $fecha . "\n
  43. Desde donde nos escribes:\n " . $pais . "\n
  44. Cuantas personas son?:\n " . $personas . "\n
  45. Mensaje del turista:\n " . $mensaje;
  46.  
  47. mail($destino,"Consulta", $contenido, $cont);
  48. header("Location:https://guiamoscow.es.tl/muchas-gracias.htm");
  49. ?>


Título: Re: validar formulario desde servidor en PHP / Textarea
Publicado por: febef en 8 Enero 2019, 23:02 pm
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
  1.    preg_match_all('/[a-z]+:\/\/\S+|sex|porn/', $input_texarea, $output_array)
  2.  
  3.    if (count ($output_array) > 0) {
  4.       echo "se encontraron cadenas no permitidas";
  5.    }
  6.  


Saludos!


Título: Re: validar formulario desde servidor en PHP / Textarea
Publicado por: chatiel en 12 Enero 2019, 06:29 am
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.
Código:
<?php
$buscar= array("sex", "porn", "violencia");
$reemplazar= array("", "po..", "violenc");
$mensaje = str_replace($buscar, $reemplazar, $mensaje);
//by chatiel
?>

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

Adicionales:
Te recomiendo quitar el siguiente texto del primer archivo
Código:
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.


Título: Re: validar formulario desde servidor en PHP / Textarea
Publicado por: #!drvy en 15 Enero 2019, 13:59 pm
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



Título: Re: validar formulario desde servidor en PHP / Textarea
Publicado por: chatiel en 18 Enero 2019, 06:01 am
Excelente bro!
No pensé que exista otro enfermo como yo en SEO  ;-)