ver usuarios usuario tabla recuperar por encriptar desencriptar defecto crear contraseñas contraseña php mysql security passwords

php - usuarios - usuario root mysql



un mejor enfoque que el almacenamiento de la contraseña de mysql en texto plano en el archivo de configuración? (7)

Además de almacenar estos datos confidenciales correctamente, también debe crear un usuario de MySQL separado que tenga solo los privilegios necesarios y restringir el acceso a la base de datos / tablas / vistas a las que necesita tener acceso. Y dado que el servidor de la base de datos a menudo se ejecuta en la misma máquina que el servidor web, también restringe el acceso a los accesos locales. Por lo tanto, no use el usuario con privilegios de administrador si solo necesita leer datos de una sola base de datos / tabla.

Siempre me ha molestado que muchos programas PHP requieran que el usuario almacene la contraseña de mysql en texto plano (en una cadena o constante) en un archivo de configuración en la raíz de la aplicación.

¿Hay algún mejor enfoque para esto después de todos estos años?

Hasta ahora he llegado con dos incrementos de seguridad mínimos:

  1. hacer que el archivo sea ilegible a través de la web usando las reglas en .htaccess (en caso de que php falle o exista una vulnerabilidad de seguridad para leer la fuente de php)

  2. destruir la contraseña en la memoria después de que db connect esté hecho (no configurado) (para evitar vuelcos de cadena de una violación de seguridad, inyección, etc.)

pero, por supuesto, ninguno de ellos resuelve el problema original.

Gracias por cualquier otra idea!


Ciertamente, nunca debe almacenar una contraseña en un archivo de texto sin formato dentro de la raíz del documento. Los pasos adicionales que tome para protegerlo dependerán del nivel de acceso que tenga para configurar su servidor web.

Puede definir la contraseña en php.ini (o mediante la configuración ini en la configuración de Apache o .htaccess). O configúrelo en el entorno cuando inicie su servidor web.

No tiene sentido encriptar la contraseña, eso significa que necesita almacenar una clave de descifrado, a menos que use la contraseña proporcionada por el usuario con quórum para descifrar la contraseña (pero esto evita que las sesiones no autentificadas accedan a la base de datos, y se vuelve desordenada cuando necesita agregar nuevos usuarios al quórum).

Si es un paquete de alojamiento barato y no tiene almacenamiento accesible fuera de la raíz del documento, entonces el almacenamiento de la contraseña en un archivo de inclusión php dentro debe evitar que se exponga (el archivo será analizado por php intead de descargado). Alternativamente, simplemente nombrar el archivo con un ''.ht'' al comienzo puede impedir el acceso remoto.

Tenga en cuenta que su segunda opción es algo redundante: si alguien puede hacer tanto daño a su código, entonces no es necesario que extraiga la contraseña del código en ejecución.

Realmente no hay solución al problema.

DO.


Como su código necesitará la contraseña, no hay una seguridad perfecta. Pero puede dificultar la recuperación.

Puse algo de hash en mi configuración web, como una variable de entorno, digamos MYSQL_PASS_HASH

Luego hago algo como md5(getenv(''MYSQL_PASS_HASH'').''gibberish$qwefsdf'') que es entonces la contraseña. Por supuesto, deberías unsetenv después si eres paranoico.

Su contraseña no se almacenará literalmente en algún lugar, y solo se podrá recuperar cuando alguien tenga tanto su configuración web como su base de datos.

Esto sucede en un archivo fuera de la webroot (no pongas toda tu confianza en .htaccess ).


Mantener sus archivos de configuración fuera de la raíz de su documento es una forma popular de mejorar la seguridad de los archivos de configuración.


No tiene que estar en la webroot. Puede mover el archivo fuera de la webroot y llamarlo de esa manera. Esto solo significará que el archivo no puede ser llamado directamente desde la web.

Si su código tiene fallas de seguridad, como incluir cosas sin filtrar desde datos GET, entonces ese archivo aún está en riesgo. La verdadera clave es asegurarse de que su aplicación sea segura también.


Personalmente, almaceno información confidencial, como detalles de conexión a la base de datos en un archivo config.ini fuera de la raíz de mi carpeta web. Entonces en mi index.php puedo hacer:

$config = parse_ini_file(''../config.ini'');

Esto significa que las variables no son visibles si su servidor comienza a generar scripts PHP como texto sin formato (lo que sucedió antes, infamemente en Facebook); y solo los scripts PHP tienen acceso a las variables.

Tampoco depende de .htaccess en el que no haya contingencia si su archivo .htaccess se mueve o se destruye.

Advertencia, agregada el 14 de febrero de 2017: ahora almacenaré parámetros de configuración como este como variables de entorno. No he usado el enfoque de archivo .ini desde hace un tiempo.


Si está dispuesto a sacrificar disponibilidad para la seguridad de archivos, puede quitar la contraseña del archivo de configuración y solicitarle a un administrador que la escriba al arrancar y almacenarla en una variable global.

Aún debe asegurarse de estar a salvo de los ataques de inyección que podrían eliminar esa variable y, por supuesto, tiene un paso manual en el proceso de (re) arranque.