php - seguridad - strip_tags
¿Qué problemas de seguridad debo tener en cuenta en PHP? (18)
- Siempre cierre su conexión SQL.
- Siempre libere los resultados de SQL.
- Siempre frote todas las variables su puesta en una base de datos.
- Al eliminar o eliminar de sql use el límite 1 por si acaso.
- Al desarrollar asegúrese de tener un bloqueo en las cosas para mantener lo no deseado. Si está abierto y usted sabe que no debe cargar la página en este momento porque podría romper algo, no significa que otras personas lo hagan.
- Nunca use Admin o Root como nombre de inicio de sesión del servidor.
Acabo de empezar a aprender PHP, he estado desarrollando aplicaciones web en ASP.Net durante mucho tiempo. Me preguntaba si hay algún error de seguridad específico de PHP que debería estar buscando.
Entonces, mi pregunta es, ¿cuáles son los principales consejos de seguridad que todo desarrollador de PHP debería saber?
Manténgalo en un consejo por respuesta para que las personas puedan votar de manera positiva / positiva.
- Siempre desinfecte y valide los datos transmitidos desde la página
- En conjunción con el n. ° 1, escapa siempre correctamente de tu salida
- Siempre apague
display_errors
en producción - Si utiliza un back-end de DB utilice un controlador que admita / emule declaraciones preparadas y las use sin prejuicios :-)
(Sin ningún orden en particular)
- Siempre verifique que los registros globales estén desactivados
- Siempre verifique que las comillas mágicas estén desactivadas
- Asegúrese de comprender los ataques de inyección SQL
- Desactivar el informe de errores en producción
EDITAR: Para los "novatos", este es un motivo básico (y dado que tengo tiempo para explicar esto):
Registrarse en globals es una aberración. Es el último agujero de seguridad jamás visto. Por ejemplo, si register_globals está activado, la url http://www.yourdomain.com/foo.php?isAdmin=1 declarará $ isAdmin como una variable global sin código requerido. No sé por qué esta "característica" ha llegado a PHP, pero las personas detrás de esto deberían tener el siguiente tatuaje en la frente: "¡Inventé PHP Register Globals" para que podamos huir de ellos como plagas cuando los vemos!
Las citas mágicas son otra idea tonta que ha llegado a PHP. Básicamente, cuando ON PHP escapará las comillas automáticamente (''become /' y "become /") para ayudar con los ataques de inyección SQL. El concepto no es malo (ayuda a evitar los ataques de inyección), pero si se escapan todos los valores GET, POST y COOKIE, el código se volverá mucho más complejo (por ejemplo, tendrá que deshacer el paisaje cada vez que muestre datos). Además, si un día apagas esta configuración sin realizar ningún cambio en tu código, todo tu código y / o datos se rompen y (aún más) son vulnerables a los ataques de inyección (sí, incluso cuando estás en estado vulnerable).
Sus datos de databse son lo más valioso en su sitio. No quiere que la gente lo fastidie, así que protéjase y lea cosas al respecto y codifique con esto en mente.
De nuevo, esto puede generar problemas de seguridad. El mensaje de error puede dar pistas sobre cómo funciona tu código. Además, estos mensajes no significan nada para sus visitantes, entonces, ¿por qué mostrarlos?
A menudo, los tutoriales introductorios no hablan para nada de verificar los datos de los usuarios. Como todos los entornos de programación, nunca confíe en los datos que obtiene de los usuarios. Aprenda a usar funciones como is_numeric()
, isset()
y mysql_real_escape_string()
para proteger su sistema.
También hay funciones que le permiten acceder a archivos remotos y otras cosas creativas. Los evitaría hasta que entiendas bien cómo y cuándo funcionan (a menudo están deshabilitados por razones de seguridad).
Eche un vistazo a Suhosin Hardening Patch y revise las vulnerabilidades de seguridad que aborda .
Evita el uso de register_globals .
Advertencia: Esta característica ha sido DEPURADA a partir de PHP 5.3.0 y RETIRADA a partir de PHP 5.4.0.
Hay toneladas de precauciones de seguridad. Puedo recomendar un libro Chris Shiflett: PHP y seguridad de aplicaciones web.
La guía PHPSec ofrece una buena descripción general.
La mayoría de los problemas de seguridad relacionados con PHP provienen del uso de variables "externas" (GET / POST / COOKIE) no analizadas. Las personas colocan ese tipo de datos directamente en rutas de archivos o consultas SQL, lo que resulta en fugas de archivos o inyecciones sql.
OWASP proporciona una gran cantidad de información sobre los problemas de seguridad que son los mayores problemas en las aplicaciones de hoy. Es agradable ver que tienen una página dedicada de PHP disponible
Programador Vs del lenguaje. Puede escribir la vulnerabilidad más grave y no recibirá un mensaje de advertencia o error. Las vulnerabilidades pueden ser tan simples como agregar o eliminar 2 caracteres en tu código. Hay cientos de tipos diferentes de vulnerabilidades que afectan las aplicaciones PHP. La mayoría de la gente piensa en XSS y Sql Injection porque son los más populares.
Lea el TOP 10 de OWASP .
Si está utilizando una base de datos mysql, asegúrese de llamar a mysql_real_escape_string cuando envíe datos a la base de datos.
Siempre que sea posible, use declaraciones preparadas ( tutorial . Es casi obligatorio cuando se trata de la entrada del usuario (digo "casi" porque hay algunos casos de uso donde no funcionan), e incluso cuando no se trata de información, lo mantienen a usted en el hábito. Sin mencionar que pueden conducir a un mejor rendimiento, y son MUCHO más fáciles, una vez que te metes en el columpio de las cosas, que desinfectar por partes.
Siempre use POST y no GET para datos importantes ...
Use el método POST para el paso de datos de una página a otra.
Use trim mientras obtiene datos como trim($_POST)
. Además, use strip_tags
para variables antes de pasar a las consultas.
Estoy sugiriendo que use cualquier enlace de marco Codeigniter, Laravel, YII, Cake PHP, ya que el marco de trabajo con todos los valores
Sugiero Codeigniter para pequeños proyectos y Laravel para grandes proyectos.
aquí hay un enlace de buenas prácticas de programación de seguridad PHP.
La mayoría de los problemas de seguridad giran en torno a los comentarios de los usuarios (naturalmente) y se aseguran de que no te jodan. Siempre asegúrese de validar su entrada.
http://htmlfixit.com/cgi-tutes/tutorial_PHP_Security_Issues.php
no use "Registrar variables globales" y filtre la entrada del usuario para xss e inyecciones
- Wiki Cross Site Scripting (XSS), Google
- Cross Site Request Forgery (XSRF / CSRF) Wiki , Google (gracias Rook)
- Wiki SQL Injection (SQLi), Google
- Desactivar mensajes de error en entornos de producción
- Mantenga cualquier código "incluir" en un directorio que no sea accesible a través de la web (ya sea denegar el acceso o mantenerlo fuera de la raíz web)
- Aquí hay un artículo que escribí sobre el almacenamiento de contraseñas de una manera segura , y si no tiene ganas de tomar mi palabra, verifique los enlaces en la parte inferior.
- También vinculado en mi artículo, pero dado su propio enlace por separado aquí, es un documento publicado por MIT llamado The DOs and DON''Ts of Client Authentication on the Web [PDF] . Si bien parte de su información (recomendación para usar hash MD5, por un lado) está algo desactualizada simplemente por lo que sabemos ahora versus lo que sabíamos entonces, los principios generales son muy sólidos y deben considerarse.
- Uno de los enlaces de Rooks me recordó otro conjunto importante de restricciones
- Desactivar Register Globals (Este es el valor predeterminado ahora, así que no lo había mencionado antes)
- Al tratar con las cargas de archivos, asegúrese de usar
is_uploaded_file()
para validar que se cargó un archivo ymove_uploaded_file()
lugar decopy()
orename()
.- Lea esta sección del Manual de PHP si necesita saber por qué (y lo hace).
- Como ya lo mencioné dos veces, consulte la respuesta de Rooks ( https://.com/questions/2275771/what-are-the-most-important-safety-precautions-that-a-php-developer-needs-to-know#2275788 ) ya que incluye un enlace a un documento que contiene información (no específica de PHP) sobre las cuestiones de seguridad más importantes (y esta es probablemente la respuesta correcta).