Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP
Code

Construyendo Tu Startup: Incrementando Seguridad

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Invite People via URL
Building Your Startup: Preparing for Text Messaging

Spanish (Español) translation by Rafael Chavarría (you can also view the original English article)

Final product image
What You'll Be Creating

Este tutorial es parte de la serie Construyendo Tu Startup Con PHP en Envato Tuts+. En esta serie, te estaré guiando a través de lanzar una startup desde concepto a realidad usando mi aplicación Planificador de Reuniones como un ejemplo de la vida real. Cada paso a lo largo del camino, lanzaré el código de Planificador de Reuniones como ejemplos de código abierto de los cuales puedes aprender. También abordaré temas de negocios relacionados con startup conforme se presenten.

En el episodio anterior, cubrí primariamente seguridad de servidor web y control de acceso. En el episodio de hoy, discutiré garantías adicionales que agregué a Planificador de Reuniones. Ya que todo el código está escrito en el Framework Yii2 para PHP, pude sacar ventaja del framework para un número de estas fortificaciones. Si te gustaría aprender más acerca de Yii2, revisa nuestra serie paralela Programando con Yii2.

Puedes probar nuestro Planificador de Reuniones ahora mismo programando tu primera reunión. Siéntete libre de publicar retroalimentación sobre tu experiencia en los comentarios de abajo. También estoy abierto a ideas de nuevas características y sugerencias de temas para futuros tutoriales.

Construyendo Seguridad Incrementada.

Implementar los varios niveles de seguridad para Planificador de Reuniones tomará varios episodios. Ahora que el servidor está configurado de manera más robusta, quiero guiarte a través de las áreas de seguridad para el código.

Protegiendo Llaves y Códigos

Obviamente, es importante para mantener llaves de autentificación lejos de hackers, pero también es bastante fácil publicarlos en GitHub. Se cuentan historias de registros accidentales de archivos con una contraseña de servicio o clave de API.

Para prevenir esto en Yii, mantengo un archivo .ini externo fuera del árbol de código. Esto se carga en la parte superior de /frontend/config/main.php y es usado para cualquier componente de configuración que sea necesario:

En el ejemplo de arriba, puedes ver los secretos de la API de Facebook desde el archivo de inicialización.

El formato de inicialización es bastante simple:

Yii2 te alienta a que coloques algunos de estos ajustes en el directorio /enviroments, especialmente cuando los ajusten varían entre desarrollo y producción.

Así pues, es importante que tu archivo .gitignore excluya las versiones locales de estos archivos:

Aquí hay un ejemplo de uno de mis archivos de parámetro, /frontend/config/params-local.php:

Podría probablemente pasar incluso más tiempo organizando estos mejor.

Bloqueando Inicios de Sesión Incorrectos

Building Your Own Startup - Preventing Spam Signups

Para la liberación alpha, mandé actualizaciones en olas. Y, en las etapas tempranas de Planificador de Reuniones, hubo un número mayor de correos incorrectos de lo que esperaba. Mailgun facilitó identificar los rebotes y fallas:

La mayoría de estos son probables de la brecha de tiempo cuando Planificador de Reuniones era nuevo y estaba sin usar--durante mi tratamiento y cirugía de tumor cerebral.

Más recientemente, agregando estos inicios de sesión sociales, he hecho el registro para Planificador de Reuniones bastante sencillo, pero los registros de spam aún son posibles. Quise hacer más difícil para la gente que se registrara con emails incorrectos.

Afortunadamente, Yii ofrece un par de características que soporta esto.

Captcha

Yii2 ahora ofrece un captcha integrado. Así que, cualquiera que se registre con el método de la vieja escuela de email y contraseña tiene que ingresar un captcha. Puedes ver el campo captcha abajo:

Entonces, en conformidad con el captcha es agregada una regla para el modelo SignupForm:

Si la gente no quiere ingresar la respuesta captcha correcta, no pueden registrarse. Esto hace el registro automatizado más difícil para spammers.

CheckDNS

También quise minimizar el registro con cuentas de correo falsas. La validación checkDNS de Yii de hecho busca un registro MX válido basado en el dominio de la dirección de email:

Así qué, por ejemplo, si me equivocara al teclear gmail.com como gmal.com, checkDNS regresaría false. No hay registro MX para gmal.com. De manera similar, no hay ninguno para pambotolympics9922.com.

Por último, la seguridad es un proceso iterativo. Siempre hay más por hacer.

Limitando Acciones Abusivas.

Después, quise agregar límites comunes al número de acciones que la gente podría hacer, para limitar abuso y prevenir a la aplicación de volverse pesada.

Creación de Reunión

Para prevenir a la gente de crear muchas reuniones vacías, creé un findEmptyMeeting que busca una reunión vacía y la re-usa cuando alguien intenta crear una nueva:

En otras palabras, si un usuario va a crear una nueva reunión 1,700 veces, siempre se les presentará la primer reunión vacía que crearon.

Limitando Frecuencia de Acciones

También creé un método comúnmente estructurado withinLimit para re-usar en la aplicación lo cuál previene demasiadas acciones en un corto tiempo. El ejemplo de abajo revisa que no haya más de n número de reuniones que se hayan creado en la última hora y último día:

Cualquier vez que alguien intente crear una reunión, revisamos withinLimit para ver si pueden. Si no, mostramos el mensaje de error flash:

Limitando el Número de Acciones

También quise limitar el número general de acciones. Por ejemplo, cada participante de reunión puede solo agregar siete fechas de reunión por reunión. Dentro de MeetingTime.php, establezco MEETING_LIMIT, de manera que pueda cambiar después:

Después, MeetingTime::withinLimit() revisa para asegurar que no más de siete horarios hayan sido sugeridos por cualquier usuario:

Cuando intentan crear un MeetingTime, el controlador crea método que revisa los límites.

Asegurando trabajos CRON

Finalmente hoy, quise asegurar acceso a trabajos cron remotos. Hay algunas aproximaciones interesantes descritas en las interwebs. Por ahora, estoy revisando que el $_SERVER['REMOTE_ADDR'] (la dirección IP de petición) es el mismo servidor que el hosting $_SERVER['SERVER_ADDR'], la dirección IP local. $_SERVER['REMOTE_ADDR'] es seguro de usar para seguridad--en otras palabras, he leído que no puede ser falsificado.

Para mis propias pruebas, también permito un administrador con sesión iniciada para ejecutar trabajos cron.

Eventualmente, también agregaré una contraseña a mis trabajos cron y los muevo a las operaciones de línea de comando.

Mirando Hacia el Futuro

He logrado muchas mejoras de seguridad a lo largo de los dos episodios anteriores, pero aún hay más por hacer. En mi lista corta hay una revisión más a fondo de seguridad de acceso, especialmente vía AJAX, seguimiento de bloqueo de direcciones IP y filtrando cuidadosamente toda la entrada del usuario.

De nuevo, ¿qué estás esperando? Programa tu primera reunión, y comparte tu retroalimentación en los comentarios. También apreciaría tus comentarios en temas de seguridad.

Como siempre, puedes esperar los próximos tutoriales en la serie Construyendo Tu Startup Con PHP o seguirme en @reifman. Hay algunas cuantas grandes características más por venir.

Enlaces Relacionados

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.