Las mejores Prácticas de Seguridad de PHP últimas

 guía de seguridad de PHP

Dado que PHP es la columna vertebral de casi todos los sitios web, por lo tanto, la seguridad de PHP no debe considerarse insignificante a cualquier costo. Sin embargo, los desarrolladores de PHP tienen el privilegio de evitar amenazas comunes como falsificación de solicitudes entre sitios, inyecciones SQL y manipulación de datos. Y todo esto es útil con la ayuda de funciones de seguridad integradas en PHP que facilitan a los desarrolladores la protección del sitio web.

Se dice que PHP es el lenguaje del lado del servidor más poderoso, PHP utiliza el 80 por ciento de la web del mundo, con los 10 millones de dominios más importantes. Por esta razón en sí, es de entender que PHP le ayudará a protegerse contra los atacantes.

Proteger las aplicaciones web de todo tipo de intentos de ataque falsificados es el deber último de un desarrollador web. Debe crear sus aplicaciones web lo suficientemente protectoras como para no tener problemas de seguridad o lagunas.

PHP es el lenguaje de programación web del lado del servidor más utilizado en todo el mundo. Diferentes aplicaciones PHP comparten diferentes partes de su código y scripts con otras aplicaciones web. En caso de que el fragmento de código compartido se encuentre vulnerable, Todas las aplicaciones que utilizan ese fragmento de código compartido se ponen en riesgo y se consideran vulnerables.

Mantenga sus aplicaciones seguras en la Nube

Cloudways ofrece 2FA, SSL gratuito y funciones de seguridad más avanzadas en servidores administrados que mantienen su aplicación segura.

PHP es el lenguaje de scripting más criticado cuando se trata de seguridad. Una gran parte de los desarrolladores y expertos en control de calidad piensan que PHP no tiene técnicas sólidas para proteger las aplicaciones. El veredicto también tiene algo de fundamento porque PHP es el lenguaje más antiguo y ampliamente utilizado para el desarrollo de aplicaciones web. Pero durante mucho tiempo desde PHP 5.6, no hemos visto ninguna actualización importante con respecto a la seguridad y, por lo tanto, el lenguaje enfrenta algunos problemas de seguridad.

Qué tan seguro es PHP

PHP es tan seguro como cualquier otro lenguaje importante. PHP es tan seguro como cualquier lenguaje principal del lado del servidor. Con los nuevos marcos y herramientas de PHP introducidos en los últimos años, ahora es más fácil que nunca administrar la seguridad de primer nivel.

Si hacemos una comparación, PHP está uniformemente asegurado. Rails, Java, Javascript y otros lenguajes, todos han tenido sus vulnerabilidades a lo largo de los años. «Si encuentras un lenguaje que no ha tenido una vulnerabilidad de alguna forma, puedes escribir código seguro en PHP perfectamente bien.

Los problemas de seguridad en CMS PHP

CMS populares como WordPress, Joomla, Magento y Drupal están construidos en PHP y, según Sucuri, la mayoría de las vulnerabilidades en CMS PHP salieron a la luz durante el año 2017:

  • Los problemas de seguridad de WordPress aumentaron del 74% en el tercer trimestre de 2016 al 83% en 2017.
  • Los problemas de seguridad de Joomla han caído del 17% en el 3T de 2016 al 13,1% en 2017.
  • Los problemas de seguridad de Magento aumentaron marginalmente del 6% en el tercer trimestre de 2016 al 6,5% en 2017.
  • Los problemas de seguridad de Drupal se redujeron ligeramente del 2% en el tercer trimestre de 2016 al 1,6% en 2017.

comparación de infecciones por cms

comparación de infecciones de cms

La situación actual no es lo suficientemente buena, pero gracias a los colaboradores de código abierto, que se esfuerzan por superar los problemas y hemos visto algunos cambios drásticos en PHP últimamente. PHP 7.x se lanzó el año pasado con varias actualizaciones y correcciones. Lo mejor de PHP 7.x se refiere a las actualizaciones de seguridad que realmente renovaron el protocolo de seguridad del lenguaje.

¿Qué Contiene Este Tutorial de Seguridad PHP?

He estado trabajando en problemas de seguridad y rendimiento de PHP durante mucho tiempo, siendo muy activo en la comunidad de PHP preguntando a los mejores desarrolladores sobre los consejos y trucos que están utilizando en sus proyectos en vivo. Por lo tanto, el objetivo principal de este tutorial de seguridad PHP es informarle sobre las mejores prácticas para la seguridad en aplicaciones web PHP. Definiré los siguientes problemas y mencionaré posibles soluciones para ellos.

  • Actualizar PHP regularmente
  • Cross site scripting (XSS)
  • Ataques de inyección SQL
  • Falsificación de solicitudes de sitios cruzados XSRF/CSRF
  • Secuestro de sesiones
  • Ocultar archivos del navegador
  • de forma segura Subir archivos
  • Usar certificados SSL Para HTTPs
  • Implementar aplicaciones PHP en nubes

Nota: no lo considere como una hoja de trucos completa. Debe haber mejores formas y más desarrolladores de soluciones únicas que se aplicarían en sus aplicaciones para que sea perfectamente seguro.

Prácticas recomendadas de seguridad de PHP

Al crear una aplicación web PHP, un ingeniero web debe preocuparse por las prácticas recomendadas de seguridad. Una aplicación web insegura brinda a los hackers la oportunidad de tomar datos valiosos, como información de clientes o detalles de tarjetas de crédito. Además, una filtración de datos puede tener un efecto extremo en la validez y las operaciones futuras de su organización.

Actualizar PHP regularmente

En este momento, la versión más estable y más reciente de PHP disponible es PHP 8. Le recomiendo que actualice su aplicación PHP a esta nueva. Si todavía está utilizando PHP 5.6 o 7, entonces tendrá muchas desaprobaciones al actualizar aplicaciones PHP. También tendrá que actualizar su código y cambiar algunas lógicas funcionales como el hashing de contraseñas, etc. También hay algunas herramientas disponibles para verificar la obsolescencia de su código y ayudarlo a migrarlas. He enumerado algunas herramientas a continuación:

  1. Comprobador de compatibilidad de PHP
  2. PHP MAR
  3. Phan

Si está utilizando PhpStorm, puede usar la Inspección de compatibilidad de PHP 7, que le mostrará qué código le causará problemas.

Leer más: Alojamiento PHP en Cloudways

Cross-site scripting (XSS)

Cross site scripting es un tipo de ataque web malicioso en el que se inyecta un script externo en el código o salida del sitio web. El atacante puede enviar código infectado al usuario final, mientras que el navegador no puede identificarlo como un script de confianza. Este ataque ocurre principalmente en los lugares donde el usuario tiene la capacidad de ingresar y enviar datos. El ataque puede acceder a cookies, sesiones y otra información sensible sobre el navegador. Veamos el ejemplo de una solicitud GET que envía algunos datos a través de la URL:

URL: http://example.com/search.php?search=<script>alert('test')</script>$search = $_GET ?? null;echo 'Search results for '.$search;

Puede descubrir este ataque usando htmlspecialchars. También mediante el uso de ENT_QUOTES, puede escapar de comillas simples y dobles.

$search = htmlspecialchars($search, ENT_QUOTES, 'UTF-8');echo 'Search results for '.$search;

Mientras tanto, los ataques XSS también pueden ejecutarse a través de atributos, esquemas de URI codificados y codificación de código.

Más información: Prevenir XSS en Laravel

Ataques de inyección SQL

La inyección SQL es el ataque más común en scripts PHP. Una sola consulta puede comprometer toda la aplicación. En el ataque de inyección SQL, el atacante intenta alterar los datos que está pasando a través de consultas. Supongamos que está procesando datos de usuario directamente en consultas SQL y, de repente, un atacante anónimo usa en secreto diferentes caracteres para omitirlos. Consulte la consulta SQL mencionada a continuación:

$sql = "SELECT * FROM users WHERE username = '" . $username . "';

El username username puede contener datos alterados que pueden dañar la base de datos, incluida la eliminación de toda la base de datos en un abrir y cerrar de ojos. Entonces, ¿cuál es la solución? DOP. Le recomiendo que utilice siempre declaraciones preparadas. PDO le ayuda a proteger las consultas SQL.

$id = $_GET ?? null;

La conexión entre la base de datos y la aplicación se realiza con la siguiente declaración:

$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbusername', 'dbpassword');

Puede seleccionar el nombre de usuario basado en el ID anterior, ¡pero espere! Aquí el código SQL ‘GET data’ se inyecta en su consulta. Tenga cuidado de evitar dicha codificación y use declaraciones preparadas en su lugar:

$sql = "SELECT username, email FROM users WHERE id = ".$id." ;foreach ($dbh->query($sql) as $row) { printf ("%s (%s)\n", $row, $row);}

Ahora puede evitar la posibilidad de inyección SQL anterior utilizando

$sql = "SELECT username, email FROM users WHERE id = :id";$sth = $dbh->prepare($sql, );$sth->execute();$users = $sth->fetchAll();

Además, una buena práctica es usar doctrine como doctrine o eloquent, ya que hay la menor posibilidad de inyectar consultas SQL en ellos.

Leer más: Proteger el sitio web PHP De Inyección SQL

Falsificación de solicitudes de sitios cruzados XSRF/CSRF

El ataque CSRF es bastante diferente a los ataques XSS. En el ataque CSRF, el usuario final puede realizar acciones no deseadas en los sitios web autenticados y puede transferir comandos maliciosos al sitio para ejecutar cualquier acción no deseada. CSRF no puede leer los datos de la solicitud y se dirige principalmente a la solicitud de cambio de estado enviando cualquier enlace o dato alterado en etiquetas HTML. Puede obligar al usuario a realizar solicitudes de cambio de estado, como transferir fondos, cambiar sus direcciones de correo electrónico, etc. Veamos esta URL en la que GET requests está enviando dinero a otra cuenta:

GET http://bank.com/transfer.do?acct=TIM&amount=100 HTTP/1.1

Ahora, si alguien quiere explotar la aplicación web, cambiará la URL con el nombre y la cantidad como este

http://bank.com/transfer.do?acct=Sandy&amount=100000

Ahora esta URL se puede enviar por correo electrónico en cualquier archivo, Imagen, etc. y el atacante puede pedirle que descargue el archivo

o haga clic en la imagen. Y tan pronto como lo haces, al instante terminas enviando una gran cantidad de dinero que nunca sabes.

Secuestro de sesión

El secuestro de sesión es un tipo particular de ataque web malicioso en el que el atacante roba en secreto el ID de sesión del usuario. Ese ID de sesión se envía al servidor donde la matriz asociada valid _SESSION valida su almacenamiento en la pila y otorga acceso a la aplicación. El secuestro de sesión es posible a través de un ataque XSS o cuando alguien obtiene acceso a la carpeta en un servidor donde se almacenan los datos de la sesión.

Para evitar el secuestro de sesiones, siempre vincule las sesiones a su dirección IP para:

$IP = getenv ( "REMOTE_ADDR" );

Esté atento cuando trabaje en localhost, ya que no le proporciona la IP exacta, sino valores de tipo :::1 o :::127. Debe invalidar (desajustar la cookie, desajustar el almacenamiento de la sesión, eliminar rastros) la sesión rápidamente cada vez que se produzca una violación y siempre debe intentar no exponer los ID bajo ninguna circunstancia.

para las cookies, la mejor práctica es nunca usar serializar los datos almacenados en una cookie. Los hackers pueden manipular las cookies fácilmente, lo que resulta en agregar variables a su alcance. Elimine las cookies de forma segura de esta manera:

setcookie ($name, "", 1);setcookie ($name, false);unset($_COOKIE);

La primera línea del código garantiza que la cookie caduque en el navegador, la segunda línea muestra la forma estándar de eliminar una cookie (por lo tanto, no puede almacenar false en una cookie). La tercera línea elimina la cookie de su script.

Leer más: Redis Server Como Manejador de sesiones PHP

Ocultar archivos del Navegador

Si ha utilizado micromarkets de PHP, debe haber visto la estructura de directorios específica que garantiza la colocación de archivos correctamente. Los frameworks permiten tener diferentes archivos como controladores, modelos, archivos de configuración(.yaml), etc en ese directorio, pero la mayoría de las veces el navegador no procesa todos los archivos, sin embargo, están disponibles para ver en el navegador. Para resolver este problema, no debe colocar los archivos en el directorio raíz, sino en una carpeta pública para que no se pueda acceder a ellos todo el tiempo en el navegador. Mira la estructura de directorios del marco Slim a continuación:

estructura de directorios delgada

estructura de directorios delgada

Cargar archivos de forma segura

La carga de archivos es una parte necesaria de cualquier aplicación de procesamiento de datos de usuario. Pero recuerde que en algunos puntos, los archivos también se utilizan para ataques XSS, como ya he explicado anteriormente en el artículo. Volviendo a lo básico, siempre use la solicitud POST en el formulario y declare la propiedad enctype = «multipart / form-data» en la etiqueta <form>. A continuación, valide el tipo de archivo utilizando la clase finfo de esta manera:

$finfo = new finfo(FILEINFO_MIME_TYPE);$fileContents = file_get_contents($_FILES);$mimeType = $finfo->buffer($fileContents);

Los desarrolladores pueden crear sus propias reglas de validación de archivos personalizadas y ultra seguras, pero algunos frameworks como Laravel, Symfony y codeigniter ya tienen métodos predefinidos para validar tipos de archivos.

veamos otro ejemplo. El HTML del formulario debe ser así:

<form method="post" enctype="multipart/form-data" action="upload.php"> File: <input type="file" name="pictures" multiple="true"> <input type="submit"></form>

Y sube.php contiene el siguiente código:

foreach ($_FILES as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmpName = $_FILES; $name = basename($_FILES); move_uploaded_file($tmpName, "/var/www/project/uploads/$name"); }}

Declarar correctamente UPLOAD_ERR y basename () puede evitar ataques de recorrido de directorios, pero también se requieren pocas otras validaciones, como el tamaño del archivo, el cambio de nombre del archivo y el almacenamiento de archivos cargados en una ubicación privada, para reforzar la seguridad de las aplicaciones.

Leer más: Carga de imágenes y archivos en PHP

Use certificados SSL Para HTTPS

Todos los navegadores modernos como Google Chrome, Opera, Firefox y otros, recomiendan usar el protocolo HTTPS para aplicaciones web. HTTPs proporciona un canal de acceso seguro y cifrado para sitios no confiables. Debe incluir HTTPS instalando el certificado SSL en su sitio web. También fortalece sus aplicaciones web contra los ataques XSS y evita que los hackers lean los datos transportados utilizando códigos. Cloudways proporciona certificados SSL gratuitos con un solo clic que son válidos por 90 días y puede revocarlos o renovarlos fácilmente con un clic. Puede seguir las guías para configurar certificados SSL en sus aplicaciones PHP, WordPress, Magento y Drupal.

Implementar aplicaciones PHP en nubes

El alojamiento es el paso final y primordial para cualquier aplicación web, ya que siempre crea el proyecto en servidores PHP locales y los implementa en servidores en vivo que ofrecen alojamiento compartido, en la nube o dedicado. Siempre recomiendo usar alojamiento en la nube como DigitalOcean, Linode, AWS. Son rápidos, seguros y seguros para cualquier tipo de sitio web y aplicación. Siempre proporcionan una capa segura para evitar ataques DDOS, de fuerza bruta y de phishing, que son muy perjudiciales para las aplicaciones web.

También le puede gustar: Trampas del alojamiento compartido Laravel para sus proyectos

Para implementar aplicaciones PHP en servidores en la nube, debe tener buenas habilidades en Linux para crear potentes pilas web como LAMP o LEMP, lo que a menudo le cuesta tiempo y presupuesto a los profesionales de Linux. En su lugar, la plataforma de alojamiento PHP y MySQL administrada de Cloudways le proporciona la manera fácil de implementar servidores con Thunderstack en pocos clics en los proveedores de nube mencionados anteriormente. Thunderstack ayuda a que su aplicación PHP esté completamente protegida de varios ataques maliciosos y garantiza un rendimiento optimizado.

Leer más: El entorno de ensayo mejorado de Cloudways Ya está disponible para Todos los Usuarios

Configuración de raíz de documentos

La raíz de documentos para aplicaciones PHP en cualquier servidor debe estar configurada en var/www/html para que los usuarios puedan acceder a su sitio web a través del navegador. Pero en algunos casos, cuando está desarrollando API con frameworks como Laravel, Symfony y Slim, necesita actualizar el webroot a la carpeta ‘ / public.

/ public sirve la salida de una aplicación similar a un sitio web PHP simple con índice.archivo php. El propósito de establecer el webroot en var/www/html/public es ocultar los archivos sensibles como .htaccess y .env que contienen las variables de entorno y las credenciales de la base de datos, el correo y las API de pago.

Además, frameworks como Laravel, Symfony recomiendan no mover todos sus archivos a la carpeta raíz, en lugar de crear una buena estructura de directorios para guardar archivos relacionados como vista, modelos y controladores es un enfoque más razonable.

Registre todos los errores y Escóndase en Producción

Una vez que haya desarrollado el sitio web e implementado en el servidor en vivo. Lo primero que debe hacer es deshabilitar la visualización de errores, porque los hackers pueden obtener la misma información valiosa de los errores. Establezca este parámetro en su php.archivo ini:

display_errors=Off

Ahora, después de desactivar la visualización, registre los errores de PHP en un archivo específico para necesidades futuras:

log_errors=Onerror_log=/var/log/httpd/php_scripts_error.log

Obviamente, puede cambiar el nombre del archivo como desee.

También le puede interesar: Simplificar el registro de errores de Laravel con la integración de PHP Rollbar

Lista blanca de IP pública para Mysql

Cuando trabaja con aplicaciones PHP, con frecuencia necesita configurar la base de datos mysql en scripts internos, así como en clientes mysql. La mayoría de los clientes se utilizan para configurar una conexión remota MySQL que necesita la dirección IP u otro nombre de host proporcionado por el servidor de alojamiento para crear la conexión.

La IP pública para la conexión remota de Mysql debe estar en la lista blanca de su servidor de alojamiento para que un usuario anónimo no pueda acceder a la base de datos. Por ejemplo, en Cloudways puede incluir IP en la lista blanca como:

Ahora puede conectar SQLyog o Mysql workbench para trabajar de forma remota con la base de datos.

P: ¿Cómo probar la seguridad de PHP?

A: Hay pocas herramientas de escáner de código disponibles en el mercado que puedan ayudarlo a analizar la calidad y seguridad del código de sus aplicaciones PHP. PHP Malware Finder (PMF) es una de las mejores herramientas de prueba de seguridad que ayuda a encontrar códigos maliciosos en los archivos. También puede usar RIPS, que es una herramienta de análisis de código popular que ayuda a encontrar vulnerabilidades de código en tiempo real.

P: ¿Cómo garantizar la seguridad de la base de datos PHP?

A: Para garantizar la seguridad de la base de datos, siempre debe utilizar prácticas como la protección de inyección SQL, los cortafuegos de la base de datos, el cifrado de datos regular y otros similares.

P: ¿Cuál es un método seguro para cifrar contraseñas en PHP?

A: Md5 es el acrónimo de Proceso de mensajes 5, y sha1 es el acrónimo de Algoritmo Hash seguro 1. Ambos se utilizan para cifrar cadenas. Una vez que se ha cifrado una cadena, se vuelve repetitivo decodificarla. Md5 y sha1 son excepcionalmente útiles cuando se almacenan contraseñas en la base de datos.

P: ¿Qué es una vulnerabilidad de PHP?

A: La inyección de objetos PHP es una vulnerabilidad a nivel de aplicación que parece permitir que un agresor realice diversos tipos de ataques nocivos, como Inyección de Código, Inyección SQL, Recorrido de Rutas y Denegación de Servicio.

Un ataque DDoS compromete múltiples ataques a sistemas informáticos. Los destinos habituales son servidores, sitios web u otros recursos de red.

Esto sucede cuando la entrada suministrada por el usuario no se administra antes de pasarla a la función PHP unserialize (). Dado que PHP permite la serialización de objetos, los agresores pueden pasar cadenas serializadas ad-hoc a una llamada unserialize() indefensa.

Terminando!

Bueno, las mejores prácticas de seguridad de PHP son un tema muy amplio. Los desarrolladores de todo el mundo tienden a desarrollar diferentes casos de uso para proteger las aplicaciones web. Mientras que muchas empresas ejecutan diferentes programas de recompensas para descubrir lagunas de seguridad y vulnerabilidades en sus aplicaciones y, por lo tanto, recompensar a los expertos en seguridad que señalan lagunas críticas en las aplicaciones. Este artículo cubre los problemas básicos de seguridad de PHP, para ayudarlo a comprender cómo proteger sus proyectos PHP de diferentes ataques maliciosos. También escribiré sobre algunos consejos y trucos de seguridad de PHP más en el futuro. Hasta entonces, puede contribuir con sus pensamientos y prácticas de seguridad en la sección de comentarios a continuación.

Comparte tu opinión en la sección de comentarios. COMENTA AHORA

Comparte Este Artículo

Revisión de Cliente en

«Cloudways hosting tiene uno de los mejores servicios al cliente y velocidad de alojamiento»

Sanjit C

Shahroze Nawaz

Shahroze es un Gestor de Comunidad PHP en Cloudways , Una Plataforma de Alojamiento PHP Administrada. Además de su vida laboral, le encantan las películas y los viajes. Puedes enviarle un correo electrónico a

Conéctate en: Foro de la Comunidad de Twitter

Leave a Reply

Tu dirección de correo electrónico no será publicada.