5 consejos útiles para crear aplicaciones seguras de PHP

PHP es uno de los lenguajes de programación más populares para la web. A veces, un lenguaje amigable con las características puede ayudar demasiado al programador, y los agujeros de seguridad pueden aparecer, creando obstáculos en la ruta de desarrollo. En este tutorial, veremos 5 consejos para ayudarlo a evitar algunos escollos de seguridad de PHP comunes y problemas de desarrollo..

Consejo 1: Utilice un informe de errores adecuado

Durante el proceso de desarrollo, el informe de errores de la aplicación es su
mejor amiga. Los informes de errores pueden ayudarlo a encontrar errores de ortografía en su
variables, detectar el uso incorrecto de la función y mucho más. Sin embargo, una vez
El sitio se pone en marcha la misma información que fue un aliado durante
El desarrollo puede convertirse en un traidor y decirle a sus usuarios mucho más acerca de su
sitio que desee que conozcan (el software que ejecuta, su carpeta
estructura, etc).

Una vez que su sitio esté activo, debe asegurarse de ocultar todos los errores.
informes Esto se puede hacer invocando la siguiente función simple
en la parte superior de su (s) archivo (s) de aplicación.

error_reporting (0);

Si algo sale mal, usted todavía quiere y necesita saber acerca de
eso. Por lo tanto, siempre debe asegurarse de registrar sus errores en un
archivo protegido Esto se puede hacer con la función PHP set_error_handler.

Consejo 2: Deshabilitar las "características malas" de PHP

Desde sus primeros días, los diseñadores de PHP siempre han incluido algunos
Características para facilitar el desarrollo. ¡O eso pensaron ellos! Algunos de estos
Las características útiles pueden tener consecuencias no deseadas. Yo los llamo "malos"
características "porque han permitido la validación de datos pesadillas y
creó un camino para que los errores encuentren su camino en los scripts. Uno de
Lo primero que debes hacer cuando comienza el proceso de desarrollo es
deshabilitar algunas de estas características.

Nota: Dependiendo de su anfitrión, estos pueden o no estar apagados para
tú. Si está desarrollando en su propia computadora u otro local similar
medio ambiente, probablemente no serán apagados. Algunas de estas características
También se han eliminado en el próximo PHP6, pero son omnipresentes en PHP4
Aplicaciones y solo están en desuso en aplicaciones PHP5..

Registrar Globales (register_globals)

En resumen, register_globals estaba destinado a ayudar a una aplicación rápida
desarrollo. Tomemos por ejemplo esta URL,
http: //yoursite.tld/index.php? var = 1, que incluye una cadena de consulta. los
La declaración register_globals nos permite acceder al valor con $ var
en lugar de $ _GET ['var'] automáticamente. Esto puede sonar útil para usted,
pero desafortunadamente todas las variables en el código ahora tienen esta propiedad, y
Ahora podemos acceder fácilmente a las aplicaciones PHP que no protegen contra
Esta consecuencia no deseada. El siguiente fragmento de código es solo uno
Ejemplo común que verás en los scripts PHP:

if (! empty ($ _POST ['username']) && $ _POST ['username'] == 'test' &&! empty ($ _POST ['password']) && $ _POST ['password'] == "test123 ") $ access = true; 

Si la aplicación se ejecuta con register_globals ON, un usuario podría
simplemente coloque access = 1 en una cadena de consulta, y luego tendrá acceso a
lo que sea que esté ejecutando el script.

Desafortunadamente, no podemos deshabilitar register_globals desde el script
lado (usando ini_set, como normalmente podríamos), pero podemos usar un
.Archivos htaccess para hacer esto. Algunos hosts también te permiten tener un php.ini
archivo en el servidor.

Deshabilitar con .htaccess

php_flag register_globals 0

Desactivar con php.ini

register_globals = desactivado

Nota: Si usa un archivo php.ini personalizado que no es aplicable al
servidor completo, debe incluir estas declaraciones en cada subcarpeta
que tiene PHP.

Cotizaciones mágicas (magic_quotes_gpc, magic_quotes_runtime, magic_quotes_sybase)

Magic Quotes era una característica destinada a ahorrarle a los programadores el problema de
usando addlashes () y otras características de seguridad similares en su código.
Hay al menos tres problemas asociados con citas mágicas. Uno
problema con esta característica útil es si ambas citas mágicas y
Se utilizan las barras de adición (). Si este es el caso, entonces terminas con
Se están agregando múltiples barras diagonales, causando errores. El segundo problema es si
usted hace que las citas mágicas asunción está activada y en realidad es
no. Entonces toda la entrada se deja sin marcar. El tercer problema es que la magia.
comillas solo se escapa de comillas simples y dobles, pero si está usando una
motor de base de datos, también hay muchos caracteres específicos de base de datos que
También hay que escapar. Se recomienda usar que deshabilitas esta
caracterizar y usar la validación de variable adecuada en su lugar (ver más abajo).

Desafortunadamente, tampoco podemos deshabilitar las citas mágicas del script
lado utilizando ini_set. Al igual que con register_globals, podemos usar .htaccess o
archivos php.ini para hacer esto.

Deshabilitar con .htaccess

php_flag magic_quotes_gpc 0 php_flag magic_quotes_runtime 0

Desactivar con php.ini

magic_quotes_gpc = Apagado magic_quotes_runtime = Apagado magic_quotes_sybase = Apagado 

Nota: Si usa un archivo php.ini personalizado que no es aplicable al
servidor completo, debe incluir estas declaraciones en cada subcarpeta
que tiene PHP.

Consejo 3: Validar entrada

Además de escapar de los personajes, otra excelente manera de proteger
La entrada es para validarla. Con muchas aplicaciones, en realidad ya
saber qué tipo de datos está esperando en la entrada. Así que la forma más sencilla.
Protegerse contra ataques es asegurarse de que sus usuarios solo puedan
ingrese los datos apropiados.

Por ejemplo, digamos que estamos creando una aplicación que enumera usuarios
cumpleaños y permite a los usuarios agregar sus propios. Estaremos deseando
acepte un mes como un dígito entre 1-12, un día entre 1-31 y un año
en el formato de YYYY.

Tener este tipo de lógica en su aplicación es simple y regular.
Las expresiones (expresiones regulares) son la manera perfecta de manejar la validación de entrada.
Tomemos el siguiente ejemplo:

if (! preg_match ("/ ^ [0-9] 1,2 $ /", $ _GET ['month'])) // handle error if (! preg_match ("/ ^ [0-9] 1,2 $ / ", $ _GET ['día'])) // manejar error if (! Preg_match (" / ^ [0-9] 4 $ / ", $ _GET ['año' ])) // manejar el error

En este ejemplo, simplemente verificamos (en las dos primeras declaraciones si)
para enteros [0-9] con una longitud de uno o dos 1,2 e hicimos la
lo mismo en la tercera declaración if, pero se comprobó una longitud estricta de 4
personajes 4.

En todos los casos, si los datos no coinciden con el formato que queremos,
Devuelve algún tipo de error. Este tipo de validación deja muy poco.
Espacio para cualquier tipo de ataque SQL..

Las expresiones Regex como las de arriba pueden ser un poco difíciles de
captar al principio, pero explicarlos está fuera del alcance de este
artículo. El manual de php tiene algunos recursos adicionales para ayudarlo con la validación. La base de datos PEAR también tiene algunos paquetes, como el paquete Validar para ayudar con correos electrónicos, fechas y URLS.

A continuación se muestra un ejemplo de la secuencia de comandos anterior en acción que utiliza 200 como entrada durante un mes, abc para el día y solo 09 para el año..

Consejo 4: Esté atento a los ataques de secuencias de comandos entre sitios (XSS) en la entrada del usuario

Una aplicación web generalmente acepta la entrada de los usuarios y la muestra
de alguna manera. Esto puede, por supuesto, estar en una amplia variedad de formas.
Incluyendo comentarios, hilos o publicaciones de blog en forma de HTML
código. Al aceptar una entrada, permitir HTML puede ser algo peligroso.,
porque eso permite que JavaScript se ejecute de manera no intencionada.
Si se deja abierto un agujero, se puede ejecutar JavasScript y las cookies.
podría ser secuestrado. Estos datos de cookies podrían ser utilizados para falsificar un verdadero
Cuenta y le da a un usuario ilegal acceso a los datos del sitio web..

Hay algunas formas en que puede protegerse de tales ataques. Uno
La forma es no permitir HTML por completo, porque entonces no hay posibilidad
Manera de permitir que cualquier JavaScript se ejecute. Sin embargo, si haces esto entonces
El formato tampoco está permitido, lo que no siempre es una opción para el foro.
y software de blog.

Si desea que el código HTML esté deshabilitado en su mayoría, pero aún así desea permitirlo
formateo, puede permitir solo unas pocas etiquetas HTML seleccionadas (sin
atributos) tales como o . O alternativamente,
puede permitir un conjunto popular de etiquetas llamadas "BBCode" o "Etiquetas BB"
Comúnmente visto en foros en el formato de [b] prueba [/ b]. Esto puede ser un
forma perfecta de permitir cierta personalización de formato mientras que no está permitido
cualquier cosa peligrosa. Puedes implementar BBCode usando preexistentes
paquetes como HTML_BBCodeParser o escriba su propia implementación de BBCode con expresiones regulares y una serie de declaraciones preg_replace.

Consejo 5: Protegerse contra la inyección SQL

Por último, pero no menos importante, es uno de los ataques de seguridad más conocidos.
En la web: inyección SQL. Los ataques de inyección SQL ocurren cuando los datos pasan
sin marcar, y la aplicación no escapa a los caracteres utilizados en SQL
cadenas como comillas simples (') o comillas dobles (").

Si estos caracteres no se filtran, los usuarios pueden explotar el sistema haciendo que las consultas sean siempre verdaderas y, por lo tanto, permitiéndoles engañar a los sistemas de inicio de sesión..

Afortunadamente, PHP ofrece algunas herramientas para ayudar a proteger su base de datos
entrada. Cuando está conectado a un servidor SQL puede usar estos
funciona con una simple llamada, y sus variables deben ser seguras de usar
en consultas. La mayoría de los principales sistemas de bases de datos ofrecidos con PHP incluyen
estas funciones de protección.

MySQLi le permite hacer esto de dos maneras. Ya sea con la función mysqli_real_escape_string cuando está conectado a un servidor:

$ username = mysqli_real_escape_string ($ GET ['username']); mysql_query ("SELECT * FROM tbl_members WHERE username = '". $ username. "'");

O con declaraciones preparadas..

Las declaraciones preparadas son un método para separar la lógica SQL de los datos que se le pasan. Las funciones utilizadas en la biblioteca MySQLi filtran nuestra entrada cuando vinculamos las variables a la declaración preparada. Esto se puede usar como tal (cuando está conectado a un servidor):

 $ id = $ _GET ['id']; $ statement = $ connection-> prepare ("SELECT * FROM tbl_members WHERE id =?"); $ statement-> bind_param ("i", $ id); $ statement-> execute ();

Una cosa a tener en cuenta cuando se usan declaraciones preparadas es la "i" en bind_param. i significa entero, pero puede usar s para cadena, d para doble y b para blob dependiendo de qué datos estamos pasando.

Aunque esto te protegerá en la mayoría de las circunstancias, deberías
Aún así, tenga en cuenta la correcta validación de datos como se mencionó anteriormente.

Clausura

Este breve tutorial solo puede arañar la superficie de la seguridad web..
En última instancia, corresponde a los desarrolladores garantizar que las aplicaciones que
Las edificaciones son seguras al informarse sobre los peligros de la web y
Los tipos más comunes de vulnerabilidades y ataques. Si quieres
Lea más acerca de los problemas de seguridad en PHP, hay una sección sobre seguridad en el manual de php dedicado a ellos..

Cuales son tus consejos?

  • Suscríbase a la fuente RSS de NETTUTS para obtener más artículos y artículos de desarrollo web diarios..