Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Aprender a desarrollar un sitio web con PHP y MySQL
  3. Seguridad
Extrait - Aprender a desarrollar un sitio web con PHP y MySQL Ejercicios prácticos y corregidos (3ª edición)
Extractos del libro
Aprender a desarrollar un sitio web con PHP y MySQL Ejercicios prácticos y corregidos (3ª edición) Volver a la página de compra del libro

Seguridad

Fallos de seguridad XSS

Un fallo de seguridad XSS (Cross Site Scripting) consiste en la ejecución del código HTML, JavaScript o VBScript sin conocimiento del webmaster.

Hay dos tipos de XSS.

1. XSS no permanente

Este tipo de fallos de seguridad se puede encontrar cuando recurre a una página PHP con información que se pasa en la URL.

Por ejemplo, cuando recurre a la página get_recibe.php con el parámetro nombre=Juan:

http://127.0.0.1/get_recibe.php?nombre=Juan

En la página get_recibe.php, aparece el siguiente código:

<?php  
   echo $_GET['nombre'];  
?> 

Da como resultado:

Juan

A continuación el usuario cambia Juan por:

<script>alert('Hola')</script> 

La página get_recibe abre un pop-up que muestra "Hola". El navegador ejecuta JavaScript que se ha generado con la instrucción echo $_GET[’nombre’];

En este caso, el código intruso es una alerta, pero el usuario puede introducir un código para leer las cookies, redirigir a otra URL, etc.

Para impedir esto, los navegadores suelen activar la seguridad XSS por defecto, que procede de un script que se encuentra en la URL y que por tanto no se ejecuta.

Sin embargo, no puede saber con antelación la configuración del navegador del usuario, por lo que se recomienda añadir código PHP para impedir estos scripts.

Utilice la función htmlentities()...

Derechos de la base de datos

Cuando se conecta a la base de datos en modo "root", tiene todos los derechos sobre ella. Y si se conecta a una página PHP en modo root, puede ser víctima de una inyección SQL que puede eliminar datos o incluso una tabla completa.

Para evitarlo, cree en su base de datos unos usuarios que tendrán derechos limitados y conéctese a través de estos en su código PHP. De esta manera, haga lo que haga el usuario, nunca podrá eliminar los datos.

Para crear un usuario, seleccione su base de datos en phpMyAdmin y haga clic en la pestaña Privilegios. Con esto se trata de agregar un usuario que tenga solamente derechos en modo de lectura.

Haga clic en el enlace Agregar cuenta de usuario. Introduzca el nombre "EstefaniaMorales" en el nombre y "123" en la contraseña. A continuación, compruebe los datos con la opción SELECT.

images/9_1.png

Haga clic en Continuar.

images/9_2.png

A continuación, cuando se conecte a su base de datos en una página PHP en modo de lectura, use la cuenta "EstefaniaMorales".

La cadena de conexión no es la siguiente:

<?php 
// Conexión a la base de datos 
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba"); 
?> 

sino:

<?php  
// Conexión a la base de datos solo en modo de lectura  
$base = mysqli_connect("127.0.0.1", "EstefaniaMorales"...

Inyección SQL (addslashes)

La inyección SQL tiene como objetivo inyectar un código SQL que ha escrito un usuario malicioso. Este código permite iniciar la sesión sin conocer necesariamente la contraseña, mostrar todas las contraseñas e incluso destruir la tabla por completo.

El usuario utiliza un formulario que le solicita un identificador y una contraseña. Cuando hace clic en el botón de validación, puede comprobar que la persona tiene un identificador y una contraseña correcta con una consulta de tipo:

<?php 
$login = $_POST['login']; 
$password = $_POST['contraseña']; 
$sql = "SELECT * FROM Persona WHERE login='".$login."' 
AND password='".$password."'"; 
?> 

Si la consulta devuelve una fila, significa que la persona existe en la base de datos y que, por tanto, la puede conectar.

Si el usuario no introduce el identificador y la contraseña correctos sino que introduce en el campo del identificador ‘pepe’ y en el campo de la contraseña: ’ OR 1=1 OR ’

la consulta SQL se convierte en:

$sql = "SELECT * FROM Persona WHERE login='pepe' AND password='' 
OR 1=1 OR ''"; 

El código OR 1=1 es correcto; entonces la consulta devuelve todos los registros de la tabla Persona. Así puede pensar que la persona existe...

Comprobación de la sesión

La sesión permite almacenar un objeto en la memoria mientras el usuario esté conectado a su sitio web. Es el caso, por ejemplo, de un sitio Web que contiene una página que permite iniciar sesión antes de acceder a otras páginas de su sitio web, que son: pagina1.php, pagina2.php...

Compruebe en su página de inicio que la persona existe en la base de datos antes de dirigirse a la pagina1.php. Nada impide que la persona escriba directamente http://www.misitio.es/pagina1.php para acceder de forma inmediata a esta página sin tener que identificarse. Esta persona debe conocer el nombre de la página PHP, pero algunas veces los nombres de estas páginas son muy concretos: login.php, mostrar.php, forum.php.

Para solucionar este problema, utilice las sesiones. Cuando una persona se identifique, almacene en la sesión su identificador y compruebe que la sesión se reconoce en cada página de su sitio Web.

De este modo, se mostrará en todas las páginas PHP de su sitio Web (salvo la página de conexión, que utiliza el identificador de la sesión) lo siguiente:

<?php 
session_start(); 
if (!isset($_SESSION['login'])) { 
   //redireccionar a la página de conexión 
   header("Location:conexion.php"); 
} 
?> 

Rendimiento

1. PHP 7

PHP 7 se basa en el proyecto de PHPNG (PHP Next-Gen), dirigido por Zend para accelerar las aplicaciones PHP.

Las mejoras en el rendimiento realizadas a partir de PHP 7 son verdaderamente significativas. Varían entre el 25% y el 70% en las aplicaciones y todo eso viene de la mejora de PHP, sin tener que cambiar una sola línea de código.

En el estado actual, el rendimiento de PHP 7 es igual que el de Facebook HHVM, que cuenta con un compilador JIT (Just In Time).

Tal y como muestra el gráfico siguiente del « journal du net » (web francesa con información sobre actualidad tecnológica), la velocidad para generar un fractal de Mandelbrot (figura muy compleja de calcular) es netamente más rápida con la nueva versión de PHP.

images/10RI01V3.png

Tiempo en segundos (cuanto más bajo es el número, mejor). Velocidad a la que los diferentes lenguajes generan un fractal de Mandelbrot

Este segundo gráfico muestra que en WordPress, PHP 7 ejecuta el doble de consultas por segundo que su predecesor PHP 5.6.

images/10RI02V3.png

Consultas por segundo

2. Utilización de AST

PHP 7 añade AST (Abstract Syntax Tree, o árbol sintáxico abstracto) que permite una representación intermediaria del código durante la compilación. Permite implementar sintaxis que no serían posibles con un procedimiento de compilación en un solo pasaje (como Uniform Variable...