Cuando se trata de la seguridad de las aplicaciones, además de proteger su hardware y plataforma, también debe escribir su código de forma segura. Estos son los mejores hábitos que un programador puede desarrollar para proteger su aplicación del ataque:
Validación de datos de entrada : mientras diseña su aplicación, debe esforzarse por proteger su aplicación contra entradas incorrectas. No confíes en la entrada del usuario. Aunque su aplicación está destinada a buenas personas, siempre existe la posibilidad de que algún usuario malo intente atacar su aplicación ingresando una entrada incorrecta. Si siempre valida y filtra los datos entrantes, puede crear una aplicación segura. Valide siempre los datos en su código PHP. Si está utilizando JavaScript para validar la entrada del usuario, siempre existe la posibilidad de que el usuario haya desactivado JavaScript en su navegador. En este caso, su aplicación no podrá validar la entrada. Validar en JavaScript está bien, pero para protegerse contra este tipo de problemas, también debe volver a validar los datos en PHP.
Protección contra ataques XSS: el ataque de secuencias de comandos entre sitios (ataque XSS) es un ataque basado en la inyección de código en páginas web vulnerables. El peligro es el resultado de aceptar datos de entrada no verificados y mostrarlos en el navegador.
- ¿Qué marco de trabajo de JavaScript debería integrar en un inicio web que ya usa Rails y una gran cantidad de jQuery (y bibliotecas que dependen de él)?
- ¿Tengo que saber HTML y otros lenguajes de programación de sitios web para convertirme en diseñador de sitios web?
- ¿Cómo interactúa Python con HTML y páginas web en general?
- ¿Cuáles son las principales empresas de diseño de sitios web?
- Como desarrollador web, ¿cómo le explico a mi familia que hago mucho más que solo instalar WordPress y un tema sin usar jerga técnica?
Prevención de ataques de inyección SQL
Para realizar las consultas de su base de datos, debe usar PDO. Con consultas parametrizadas y declaraciones preparadas, puede evitar la inyección de SQL.
Eche un vistazo al siguiente ejemplo:
<? php
$ sql = “SELECCIONAR * DE usuarios DONDE nombre =: nombre y edad =: edad”;
$ stmt = $ db-> prepare ($ sql);
$ stmt-> execute (array (“: name” => $ name, “: age” => $ age));
En el código anterior proporcionamos los parámetros con :name
y :age
to prepare()
, que informa al motor de la base de datos para precompilar la consulta y adjuntar los valores a los parámetros con nombre más adelante. Cuando se realiza la llamada a execute()
, la consulta se ejecuta con los valores reales de los parámetros nombrados. Si codifica de esta manera, el atacante no puede inyectar SQL malicioso ya que la consulta ya está compilada y su base de datos estará segura.
Protegiendo el sistema de archivos
Como desarrollador, siempre debe escribir su código de tal manera que ninguna de sus operaciones ponga en riesgo su sistema de archivos. Considere el siguiente PHP que descarga un archivo de acuerdo con un parámetro proporcionado por el usuario:
<? php
if (isset ($ _ GET [‘nombre de archivo’]) {
$ filename = $ _GET [‘nombre de archivo’];
encabezado (‘Content-Type: application / x-octet-stream’);
encabezado (‘Codificación de transferencia de contenido: binario’);
header (‘Content-Disposition: adjunto; filename = “‘. $ filename. ‘”;’);
echo file_get_contents ($ nombre de archivo);
}
El script es muy peligroso ya que puede servir archivos desde cualquier directorio al que pueda acceder, como el directorio de sesión y los directorios del sistema. La solución es asegurarse de que el script no intente acceder a archivos desde directorios arbitrarios.
Protección de datos de sesión
Por defecto, la información de la sesión se escribe en un directorio temporal. En el caso de un servidor de alojamiento compartido, alguien que no sea usted puede escribir un script y leer los datos de la sesión fácilmente. Por lo tanto, no debe guardar información confidencial como contraseñas o números de tarjetas de crédito en una sesión.
Una buena manera de proteger los datos de su sesión es cifrar la información almacenada en la sesión. Esto no resuelve el problema por completo ya que los datos cifrados no son completamente seguros, pero al menos la información no es legible. También debe considerar mantener los datos de su sesión almacenados en otro lugar, como una base de datos. PHP proporciona un método llamado session_set_save_handler()
que se puede usar para conservar los datos en la sesión a su manera.
A partir de PHP 5.4, puede pasar un objeto de tipo SessionHandlerInterface
a session_set_save_handler()
. Consulte la documentación de PHP para obtener información sobre cómo implementar la persistencia de sesión personalizada mediante la implementación de SessionHandlerInterface
.
Manejo adecuado de errores
Es bueno saber acerca de todos los errores que ocurren mientras desarrollamos una aplicación, pero cuando hacemos que la aplicación sea accesible para los usuarios finales, debemos tener cuidado de ocultar los errores. Si se muestran errores a los usuarios, puede hacer que nuestra aplicación sea vulnerable. Por lo tanto, el mejor enfoque es configurar su servidor de manera diferente para los entornos de desarrollo y producción.
En el modo de producción, debemos desactivar la configuración de display_errors
y display_start_up_errors
. error_reporting
y log_errors
deben estar log_errors
para que podamos registrar errores mientras los ocultamos a los usuarios finales.
Puede usar set_error_handler para definir manejadores de errores personalizados. Sin embargo, tiene limitaciones. El controlador de errores personalizado omite el mecanismo estándar de manejo de errores de PHP. No puede detectar errores como E_CORE_ERROR
, E_STRICT
o E_COMPILER_ERROR
en el mismo archivo en el que se define el controlador de errores. Además, no podrá manejar los errores que puedan ocurrir dentro del mismo controlador.
Para manejar los errores de manera elegante, debe realizar el manejo de excepciones a través de bloques try / catch. Las excepciones están representadas por la clase Exception
y sus subclases. Si ocurre algún error dentro del bloque try, puede lanzar una excepción y procesarlo en el bloque catch.