Hoy en día PHP sigue siendo uno de los lenguajes más utilizados del mundo en cuanto a desarrollo web se refiere, es cómodo, intuitivo y fácil de programar. Que sea uno de los lenguajes de programación web más utilizados es también su punto débil, ya que una mala practica a la hora de programar, o una mala configuración de seguridad, pueden hacer que tu sitio web acabe siendo hackeado, por eso es importante saber cómo programar en PHP de forma segura.
Miles de sitios web son hackeados a diario y en muchos de estos casos se debe al uso de malas prácticas, configuraciones erróneas en el servidor o por no saber programar en PHP de forma segura.
Por ello en este artículo vamos a ver que buenas practicas podemos seguir para programar en PHP de forma segura y configurar correctamente nuestro servidor web.
Mostrar la versión de una aplicación, plugin, programa, o lenguaje de programación, sea PHP o no, te expone gravemente, es un problema de seguridad importante.
Siempre que se publican actualizaciones de versiones se publican también los errores y fallos corregidos. De modo que conociendo la versión de PHP que utilizas los atacantes podrán aprovechar fallos de seguridad para hacerse con el control de tu sitio web.
Para evitar mostrar la versión de PHP, hay que añadir la siguiente linea de código en el archivo php.ini del servidor.
expose_php=Off
Cuando estamos desarrollando es muy útil tener los errores en pantalla activados de modo que cuando algo falle podamos localizarlo rápidamente, sin embargo, una vez hemos terminado de desarrollar es conveniente desactivar los errores en pantalla. Ya que si algo falla, PHP puede mostrar en pantalla información confidencial, por ejemplo, información de la base de datos (nombres de tablar), nombre de los ficheros PHP, rutas, etc.
Para evitar estos problemas debemos editar el fichero php.ini de nuestro servidor y añadir la linea:
display_errors = Off
De este modo evitaremos mostrar información importante en pantalla.
La sentencias PHP ‘include’ y ‘require’ nos permiten incluir archivos para reutilizar código, es algo imprescindible ya que nos permite organizar nuestro proyecto de forma mucho más eficiente. El problema reside, en que permite incluir archivos de otros servidores.
Esto acarrea varios problemas:
La practica más adecuada a seguir es no utilizar las sentencias para incluir archivos remotos. Pero si deseas prevenir esto, puedes agregar dos lineas de código en el archivo php.ini.
allow_url_fopen = Off
allow_url_include = Off
Uno de los métodos más utilizados por los atacantes, es la inyección de código SQL. Es un tipo de ciberataque en el cual el atacante inserta código propio en un sitio web. Haciendo esto puede obtener acceso total a nuestra base de datos, entre muchas otras cosas.
Por suerte hoy en día existen diversas formas de protegernos de este tipo de ataques, y una de ellas, consiste en utilizar sentencias precompiladas (también conocidas como sentencias preparadas) cuando desarrollemos consultas a nuestra base de datos.
Al desarrollar en PHP, la forma sencilla y cómoda de realizar una consulta SQL a nuestra base de datos seria algo similar a esto.
if ($resultado = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT)) {
Este tipo de consultas son las que acarrean problemas de seguridad, ya que la consulta se crea cada vez que se ejecuta el código pertinente, y los parámetros y variables utilizados siempre serán los mismos, esto puede dejarnos expuestos a un ataque de inyección de código.
Las sentencias preparadas ofrecen dos grandes beneficios respecto a las sentencias normales:
Las consultas pre compiladas constan de dos fases; la preparación y la ejecución.
Durante la etapa de preparación, se crea la sintaxis de la consulta, haciendo que el servidor realice una comprobación de sintaxis dejándola lista para utilizarla en cualquier momento, no se indican variables, simplemente se crea la consulta SQL, y donde queramos añadir variables utilizaremos los caracteres ‘(?)‘.
El código resultante seria parecido a esto:
$sentencia = $mysqli->prepare("INSERT INTO test(id) VALUES (?)")
De este modo la sentencia quedaría preparada y lista para utilizarla cuantas veces necesitemos, además es posible especificar distintos parámetros y variables cuando la consulta vaya a ser ejecutada.
Durante la ejecución, el desarrollador vincula las variables con la sentencia preparada, indicando así que valor se corresponde a cada parámetro, veamos un ejemplo.
$sentencia->bind_param("i", $id)
De este modo, le estamos indicando a la sentencia preparada que donde hay un parámetro ‘(?)’ debe especificar el valor de la variable $id como número entero. El primer parámetro de la función ‘bind_param()‘ indica el tipo de valor, el segundo el valor en si.
Si la sentencia prepara necesita más de un parámetro, hay que utilizar el carácter ‘?’ por cada parámetro, y en la función ‘bind_param()’, indicar de que tipo es cada uno de ellos, sin dejar espacios.
Preparación de la consulta.
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
Como podemos ver, la sentencia preparada espera 4 parámetros.
Asignamos los valores, indicando en el primer parámetro el tipo de cada valor, cada carácter hace referencia a un parámetro, el carácter ‘s’ significa que es de tipo ‘string’ y el carácter ‘d’ indica que es de tipo ‘double’.
$stmt->bind_param('sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
Finalmente ejecutamos la consulta.
$stmt->execute();
Puedes consultar más información sobre las consultas preparadas en la documentación oficial de PHP o clicando aquí.
A continuación veremos algunas buenas prácticas que podemos seguir para programar en PHP de forma más segura.
Cada vez que creemos una variable debemos inicializarla con un valor, aunque este sea 0, o vacío (»). De esta forma evitaremos que los atacantes utilicen una variable no inicializada para atacar nuestro sitio web.
Actualmente existen dos formas de enviar datos mediante un formulario web, el método GET y el método POST. Ambas formas son eficientes y el resultado final es el mismo, pero la manera en la que se transmite la información es distinta.
Ambos métodos tienen sus ventajas y sus desventajas, pero si tenemos la opción de elegir, es recomendable utilizar el método POST, ya que de esta manera la información enviada no es visible para el usuario. Al utilizar el método GET, la información enviada en el formulario será visible en la URL y es posible que en ciertas ocasiones no sea conveniente.
Otra forma de evitar que los atacantes inyecten código SQL en nuestro sitio web, es limpiando o vaciando las variables globales o inputs más habituales, las cuales son:
Dichas variables son accesibles desde cualquier fichero PHP, por lo que es importante limpiarlas una vez las hayamos utilizado.
En PHP existen numerosas funciones de validación de variables, es muy recomendable usarlas para verificar que los datos almacenados en ellas son correctos, así podremos evitar algunos ataques y errores de programación.
Aplicando estos consejos, configuraciones y buenas practicas podemos hacer que nuestro código PHP y servidor web sea más seguro. Siempre es conveniente dedicar un poco de tiempo a la seguridad de nuestro servidor y código para poder prevenir futuros problemas.
En este artículo, aprenderás qué es el Lazy Loading y cómo implementarlo fácilmente en tu… Leer más
En esta guía práctica, te explicamos qué es el presupuesto de rastreo, por qué es… Leer más
¿Alguna vez te has encontrado con un mensaje que te invita a actuar, ya sea… Leer más
Una de las preguntas más comunes entre los desarrolladores web que comienzan a usar JavaScript… Leer más
Descubre qué es y para qué sirve la preimpresión digital para conseguir una buena impresión… Leer más
Ampliamos información para las redes sociales. Descubre cómo gestionar correctamente los consentimientos necesarios en las… Leer más