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.

Ocultar versión de php

Programar en PHP de forma segura.

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

Desactivar errores en pantalla

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.

Evitar incluir archivos remotos

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:

  • El sitio web queda expuesto a código malicioso.
  • Si el servidor donde se encuentra el archivo incluido ha sido hackeado facilita que el nuestro lo acabe siendo también.
  • Nuestro sitio web, tendrá una gran dependencia del sitio web o servidor original donde se encuentra el archivo incluido, ya que si este falla, es modificado o eliminado, nuestro sitio web fallará también.

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

Utilizar consultas precompiladas

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:

  • La consulta solo necesita ser preparada una vez, pero puede ser ejecutada cuantas veces se quiera, y en cada ejecución se pueden utilizar diferentes parámetros, o utilizar los mismos.
  • Los parámetros para las sentencias preparadas no necesitan estar entrecomillados, el controlador automáticamente se encarga de esto, y es gracias a este beneficio que podemos evitar la inyección de SQL.

Cómo utilizar las consultas preparadas

Las consultas pre compiladas constan de dos fases; la preparación y la ejecución.

Preparació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.

Ejecución

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.

Veamos un ejemplo

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í.

Buenas prácticas

A continuación veremos algunas buenas prácticas que podemos seguir para programar en PHP de forma más segura.

Inicialización de variables

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.

Utilizar POST como método de envío

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.

Vaciar inputs

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:

  • $_POST
  • $_GET
  • $_SERVER
  • $_COOKIE
  • $_REQUEST

Dichas variables son accesibles desde cualquier fichero PHP, por lo que es importante limpiarlas una vez las hayamos utilizado.

Funciones de validación

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.

Conclusió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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Índice