NorfiPC
NorfiPC » Informaciones » Como proteger los formularios web

Como proteger los formularios y evitar la inyección de código SQL en PHP


Actualizado: 07 de diciembre del 2022
Por: Norfi Carrodeguas
Códigos y ejemplos prácticos para impedir el hacking, inyección SQL y el XSS en las páginas de un blog o sitio web. Como usar captchas, convertir, bloquear y escapar caracteres peligrosos. Como comprobar la seguridad de los formularios.
Como proteger los formularios y evitar la inyección de código dañino SQL en PHP
En las páginas de internet son muy empleados los formularios o formas en diversos usos, para autentificarse, contactar, enviar correos, agregar comentarios, hacer búsquedas, etc.
Hacen las páginas mucho más atractivas, útiles e interactivas para los lectores, pero traen un riesgo enorme para la seguridad de un blog o sitio web.
Son la puerta de entrada de la gran mayoría de los ataques, el hacking, la inyección de código SQL y XSS.


¿Qué es la inyección de código SQL y los ataques XSS?


Los ataques más peligrosos en la actualidad que atentan contra la seguridad de un sitio web son dos: La Inyección de código SQL y XSS, abreviaturas de Cross-site scripting.
Inyección SQL es la infiltración de código intruso dentro del código SQL de las bases de datos generalmente usando las entradas de los formularios.
El objetivo es alterar el funcionamiento del programa y lograr que se ejecute el código "invasor" incrustado.
Es una técnica poderosa con la que se puede manipular direcciones URL de cualquier forma, en entradas de búsquedas, formularios o registros de email, para inyectar el código.
XSS es la inyección de código JavaScript en aplicaciones web, páginas web y hasta en el navegador web ya sea en código insertado (script, iframes) en HTML, aprovechando las variables que se pasan entre páginas usando una URL o robando las cookies.
Ataca principalmente las aplicaciones que procesan datos obtenidos de una entrada sin ningún tipo de chequeo o validación.


¿Cómo evitar la inyección SQL y el XSS o Cross-site scripting?


Hay varias reglas de seguridad elementales que debemos tener en cuenta.
Principalmente proteger todas las puertas que abrimos en nuestras páginas con la mejor de las intenciones, que son las entradas en los formularios o cualquier elemento que utilice la etiqueta <input>.
En este artículo tratamos solo algunas de ellas que son imprescindibles.

Usar captchas en los formularios para validar las peticiones de los usuarios


Captcha es la abreviatura en ingles de "Prueba de Turing pública y automática para diferenciar máquinas y humanos".
Es una prueba para comprobar que quien introduce la información es una persona y no una máquina.
Se utilizan para impedir que se pueda tener acceso a la función de un script de forma automática.
Para eso se emplean pequeñas imágenes que representan caracteres, en ocasiones distorsionados, los que el usuario tiene que introducir en un cuadro manualmente y de coincidir, se ejecuta la función solicitada.
Estas imágenes se escriben mediante PHP, creando un pequeño archivo con solo unas líneas de código y vincularlo al formulario y viceversa.
Usar reCAPTCHA de Google en vez de Captchas
Actualmente usar captchas en formularios es desaconsejado, porque crea repulsión en los usuarios y es poco práctico.
La tendencia actual es usar el método de reCAPTCHA de Google, en la que el lector solo debe marcar una casilla y Google se encarga de comprobar que se trata de un humano y no una máquina.
Lee en otro artículo como implementarlo.
Como usar reCAPTCHA de Google para proteger un formulario


Crear limitaciones y reglas en los formularios


En cualquier formulario es necesario usar ciertas reglas para limitar las acciones de acuerdo a su uso.
Se debe utilizar como método en los formularios POST en vez de GET.
En las entradas para introducir contraseñas, en ver de <input type="text"> se debe emplear: <input type="password">
En las entradas de texto se puede limitar la cantidad de caracteres usando el atributo "maxlength".
En los formularios usados para subir archivos como imágenes, fotos, etc. puede limitarse el tipo de archivo a subir, basado en su extensión, así como regular su tamaño.
Lee más información: Como subir fotos, imágenes y otros archivos a un servidor web


Impedir la entrada de código maligno escapando los caracteres


Para evitar las inyecciones SQL y ataques XXS es necesario escapar todo lo que pueda ser introducido en cualquier consulta, reemplazando los caracteres especiales por su equivalente textual, de tal forma que se interprete todo el contenido de la variable como si fuera texto.
Se conoce como "satinizar" las entradas.
Para eso se pueden emplear distintas funciones, de acuerdo al lenguaje de programación usado.
En las entradas de los formularios que reciben comentarios y texto se pueden usar los siguientes métodos.


Convertir caracteres especiales con htmlspecialchars


Htmlspecialchars() es una función de PHP que convierte los caracteres especiales en entidades HTML.
Convierte los siguientes caracteres:
& (ampersand) - &amp;
" (comillas dobles) - &quot;
' (comilla simple) - &#039;
< (menor que) - &lt;
> (mayor que) - &gt;
Se utiliza de la siguiente forma:
htmlspecialchars('texto a escapar')
Códigos para crear dos formularios de ejemplo:
<form action="" method="post">
Su nombre: <input type="text" name="nombre">
<input type="submit">
</form>
<?php
echo "Hola ".htmlspecialchars($_POST['nombre']);
?>    
<form action="" method="post">
Tu nombre: <input type="text" name="name"><br>
Tu edad: <input type="text" name="age"><br>
<input type="submit"><br>
</form>
<?php 
 if(isset($_POST['name'])){
echo htmlspecialchars($_POST['name']); 
echo ". Tu edad es: " .(int)$_POST['age']. " años.";
}
?>


Proteger formularios de XSS

La dirección URL en el atributo "action" de los formularios, cuando conduce a la misma página donde se ejecuta, puede ser manipulada para inyectar código maligno usando Javascript.
Es uno de los métodos de XSS (Cross-site scripting).
Se evita usando "htmlspecialchars()" de la siguiente forma:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">    
Lee más información detallada en W3School: PHP 5 Form Validation

Escapar caracteres especiales con addslashes


La función addslashes() en PHP agrega barras invertidas a una cadena.
Devuelve una cadena con barras invertidas delante de los caracteres que necesitan escaparse en situaciones como consultas de bases de datos, etc.
Los caracteres que se escapan son la comilla simple ('), comilla doble ("), barra invertida (\) y NUL (el byte NULL).
Este método se conoce como "satinizar".
Se utiliza de la siguiente forma:
addslashes ('texto a escapar')
Para usarlo en el formulario anterior solo es necesario agregar la segunda línea:
$consulta = $_POST['consulta'];
$consulta = addslashes($_POST['consulta']);
Puedes probar esta opción en el primer formulario, insertando alguna palabra que contenga cualquiera de los caracteres anteriores.

Todas las funciones en un script


La función anterior htmlspecialchars, asi como addslashes() y trim() podemos usarlas al mismo tiempo en las entradas de cualquier formulario usando un script similar al siguiente.
Solo debemos definir las variables que usamos en nuestros formularios.
<?php
// definir variables
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>    

Como comprobar la seguridad de los formularios ante inyecciones SQL


Las anteriores son solo algunas reglas elementales.
La lucha contra el hacking y los ataques en internet es muy compleja y muchas las técnicas utilizadas por los atacantes.
Usar scripts en PHP en las páginas siempre trae aparejado mucho peligro.
Al implementar en cualquier página un formulario o cualquier entrada, se puede probar su vulnerabilidad ante las inyecciones SQL usando la extensión de Firefox SQL Inject Me.
Comprobando si un formulario de esta página es vulnerable a la inyección SQL con la extensión SQL Inject Me.
Comprobando si un formulario de esta página es vulnerable a la inyección SQL con la extensión SQL Inject Me
Otra extensión llamada XSS ME permite comprobar en cualquier página o aplicación web el peligro de ataques XSS.
Las dos extensiones anteriores simulan ataques en las formas seleccionadas en una página y muestran el resultado.
Los de conocimientos más avanzados y con más paciencia pueden encontrar en la siguiente página el código para hacer varias pruebas manualmente. Basic Tests for SQL-Injection Vulnerabilities
Los que poseen sitios en WordPress deben leer en detalle el siguiente artículo: Hardening WordPress

Otras páginas relacionadas



Sobre el autor:

Norfi Carrodeguas es el fundador y webmaster del sitio web Norfipc, creado en el año 2010. Norfi es un ingeniero informático y desarrollador web cubano. Con más de 14 años de experiencia en la publicación en internet, comparte su tiempo con su consultoría SEO. Más información sobre el autor.

Comparta esta página
Facebook
Twitter

Sígueme en las redes sociales


Norfipc en Facebook Norfipc en Twitter Canales RSS con las últimas publicaciones


 
Inicio | Mapa del sitio | Buscar | Sobre mí