Tips esenciales de seguridad y rendimiento en PHP

En este artículo os mostramos algunos consejos para aumentar la seguridad y el rendimiento en vuestras páginas en PHP. Tenedlos en cuenta porque os evitarán más de un quebradero de cabeza. y si queréis profundizar en ello, aquí tenéis otras buenas prácticas y recomendaciones recientes publicadas en este mismo blog.

1. Ojo con las inyecciones SQL

Los agujeros de seguridad que más mala fama le dan a PHP se podrían prevenir si somos precavidos con las conocidas como Inyecciones SQL. Podríamos evitarlo de una manera sencilla escapando de cualquier variable que podamos utilizar contra la base de datos. Por ejemplo:

$query_result = mysql_query("SELECT * FROM tabla WHERE campo = \"" . mysql_real_escape_string($campo) . "\"");

2. Actualizar la versión PHP de tu servidor

PHP sigue en constante evolución y cada versión que sale optimiza y mejora su rendimiento, ofreciendo una mayor seguridad y compatibilidad con otros sistemas.

Seguridad. Seguir con versiones antiguas, como PHP 5.4 o PHP 5.5, hará que tengamos ataques de seguridad y que solo corregiremos si tenemos una versión actualizada. Atrás quedaron sus obsoletos parches que caducaron en 2016.

Rendimiento. Cuanto más rápido cargue una web, mejor clasificación obtendremos en los motores de búsqueda y mejores posiciones tendremos en las SERP (páginas de resultados). Las versiones más recientes de PHP, son perfectas para incrementar esa velocidad, ya que son capaces de manejar más solicitudes por segundo.

3. Mantén el reporting de errores activado cuando desarrolles

Si incluimos un par de líneas de código en el fichero php.ini, evitaremos errores que producen el famoso y temido pantallazo blanco. Cuando subáis vuestros archivos a producción, recordad eliminar las líneas que hemos añadido. Este sería el código con las líneas a incluir:

error_reporting(E_ALL);
ini_set('display_errors', 1);

4. Usa más cURL

Si necesitamos rescatar un archivo de un servidor, usar file _ get _ contents()  es suficiente, aunque no tenemos control sobre lo que ocurre y resulta poco flexible.

Lo ideal es utilizar cURL, es más potente y ofrece más posibilidades (cabeceras, parámetros por POST, autenticación, diferentes outputs, conexiones FTP, conexiones SSH, encriptación…). Veamos un ejemplo:

$a = curl_init();
curl_setopt($a, CURLOPT_URL, $url);
curl_setopt($a, CURLOPT_TIMEOUT, 12);
curl_setopt($a, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec($a);
$status = curl_getinfo($a, CURLINFO_HTTP_CODE);
curl_close($a);

5. El driver mysql tiene que pasar a la historia

Deberíamos apostar por mysqli y deshacernos de una vez por todas del driver mysql para conectar con MySQL, aunque si queremos apostar más fuerte, podríamos optar por PDO, una extensión de PHP que proporciona una capa de abstracción para la conexión con distintos gestores de bases de datos.

6. Mejor comillas simples que dobles

El uso de las comillas simples en lugar de las dobles es simplemente más rápido, por lo que utiliza este tip siempre que puedas.

7. Encripta las contraseñas. PHP ya lo puede hacer de forma nativa

Desde hace algunas versiones (desde la 5.5), PHP dispone de encriptación de forma nativa para las contraseñas que almacenas en la base de datos.  Mirad cómo:

$enc_pass = password_hash($submitted_pass, PASSWORD_DEFAULT);

Para ver si la contraseña introducida es correcta, podríamos utilizar un código como este:

if (password_verify($submitted_pass, $stored_pass)) {
// La contraseña del usuario es correcta
}

8. URLs amigables con .htaccess

Las urls generadas por PHP pueden resultar amigables si utilizamos bien el fichero .htaccess, un archivo que entre una de las cosas que podemos hacer con él, encontramos la posibilidad de realizar redirecciones.

RewriteEngine On
RewriteRule ^([a-zA-Z0-9]+)$ index.php?page=$1

Hemos conseguido con ese código, que en vez de mostrarnos una URL como «http://www.mipaginaweb.com/index.php?pagina=productos».

Nos muestre otra mucha más amigable: “http://www.mipaginaweb.com/productos”.

9. Los operadores ternarios

Los operadores ternarios son una forma diferente de escribir una estructura if…else y podemos obtener en la misma línea los resultados del TRUE y FALSE. Por ejemplo:

$name = (!empty($_GET['nombre'])? $_GET['nombre'] : 'José');

La variable coge el parámetro GET y si no lo tiene le damos el valor “José”.

¿Qué sacamos con esto?, pues hacer el código más ligero y optimizado.

10. Utiliza funciones _once()

Para evitar errores que pueden provocar funciones como include() o require(), podemos utilizar include _ once() y require _ once(), que funcionan igual pero impide duplicados y estados no deseados, aunque ojo, hacedlo con precaución porque disminuye el rendimiento.

11. Encadena con un Switch en vez de Ifs

Las construcciones Switch ofrecen más soltura que las If y son más legibles, por lo que os recomendamos que las uséis con más frecuencia en vuestro código. El rendimiento aumentaría si ponemos los más utilizados al principio:

switch ($provincia) {
case 'Madrid':
echo "Provincia Madrid ";
break;
case 'Barcelona':
echo "Provincia Barcelona";
break;
case 'Valencia':
echo "Provincia Valencia";
break;
case 'Sevilla':
echo "Provincia Sevilla";
break;
}

12. Mejor enviar variables por referencia

En PHP podemos pasar variables a una función por referencia, al igual que lo hacemos en JAVA, tan solo con poner “&” antes de la variable. Con esto, conseguimos actualizar su valor sin tener que devolver nada o hacer declaraciones de variables globales. Lo vemos el siguiente ejemplo:

function square(&$bumero){
$numero = $numero * $numero;
}

$numero = 4;
square($numero);
echo $numero; // devuelve 16

13. El problema de isset()

La función isset() no hace lo que realmente tiene que realizar. Vemos el problema y la solución en los siguientes ejemplos:

Es un problema que NULL sea un valor válido de la variable:

$variable = null;
if (isset($variable)) // nos devuelve FALSE

La solución la encontramos con get _ defined _ vars() y array _ key _ exists():

$variable = NULL;
$vars = get_defined_vars();
if (array_key_exists('variable', $vars)) // nos devuelve TRUE

14. Configuración de archivos

Normalmente, la recomendación es no utilizar archivos sueltos para la configuración de una aplicación y deberían cargarse dentro de una base de datos, aunque si utilizamos en alguna ocasión un fichero de apoyo a la configuración, podríamos hacer lo siguiente:

  • Conceder a un usuario permisos especiales a esos archivos.
  • La extensión deberá ser .php para asegurar que lo lea el navegador y que no se visualice si le ponemos, por ejemplo, una extensión .txt.