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 en php publicadas en este mismo blog.
- 1. Ojo con las inyecciones SQL
- 2. Actualizar la versión PHP de tu servidor
- 3. Mantén el reporting de errores activado cuando desarrolles
- 4. Usa más cURL
- 5. El driver mysql tiene que pasar a la historia
- 6. Mejor comillas simples que dobles
- 7. Encripta las contraseñas. PHP ya lo puede hacer de forma nativa
- 8. URLs amigables con .htaccess
- 9. Los operadores ternarios
- 10. Utiliza funciones _once()
- 11. Encadena con un Switch en vez de Ifs
- 12. Mejor enviar variables por referencia
- 13. El problema de isset()
- 14. Configuración de archivos
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 «https://www.mipaginaweb.com/index.php?pagina=productos».
Nos muestre otra mucha más amigable: “https://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.