2012-01-31 13 views
7

Conozco la regla: nunca cifre su contraseña, y he visto esta pregunta here que explica qué hacer con Java y mySQL, pero no sé qué hacer con PHP y mySQL.¿Cómo puedo proteger una cadena de conexión mySQL en PHP?

La cadena de conexión actual se hizo así

<?PHP 

$DBName = "dbName"; 
$Host = "localhost"; 
$User = "dbUser"; 
$Password = "Yikes_hardcoded_PW"; 

$Link = mysql_connect($Host , $User , $Password , $DBName); 

if (!$Link) { 
    die('Could not connect: ' . mysql_error()); 
} 

?> 
  • , pero tengo que tener la contraseña asegurado, es decir, no hardcoded en este archivo. ¿Cómo lo hago?

EDIT: Para todos los downvotes que consiguen en esto, todavía no han recibido una respuesta a la pregunta que se trata de un problema de seguridad genuina - contraseñas codificadas. No es útil votar por una pregunta genuina sin publicar un comentario o respuesta que cumpla con la pregunta.

+2

bien, no ponga una contraseña en el código. Si es de código abierto, nadie necesita la contraseña de todos modos –

+2

póngalo en un archivo de configuración separado e ignórelo en GIT – Bogdan

+0

Puede poner la contraseña en un archivo separado como Bogdan sugerido y gitignore para fines de desarrollo. Para el desarrollo, en realidad podría ser más fácil simplemente mantener la contraseña en dsn. El camino que tomes depende de tu nivel de comodidad. Para la producción, guarde las contraseñas en el cuadro de producción donde se ejecutará su código. Restrinja el acceso a la caja y administre las contraseñas establecidas/restablecidas a través de chef, marioneta, tela, etc. – dminer

Respuesta

-2

No hay ninguna razón para ocultar su contraseña de MySQL. Simplemente restrinja el acceso a la base de datos desde el host remoto. Alternativamente, puede establecer un usuario MySQL predeterminado sin contraseña para este proyecto/host/base de datos/acción específicos.

Para responder a su pregunta directamente, no hay forma de ofuscar la contraseña.

+0

No esconder una contraseña parece ir en contra de la sabiduría aceptada. Tampoco estaba pidiendo que se ocultara la contraseña, solo se aseguró. – T9b

+0

@ T9b, use el usuario predeterminado entonces, sin contraseña. Pero, una vez más, no hay ninguna razón para ocultar la contraseña de MySQL si el acceso remoto está restringido, p. ver http://www.opensourcecms.com/ algunos de los CMS alojados permiten cambiar la configuración de la base de datos, el usuario también puede ver la contraseña y ellos son perfectamente conscientes de eso. – Gajus

1

Almacene sus configuraciones en otro archivo.

$DBName = "dbName"; 
$Host = "localhost"; 
$User = "dbUser"; 
$Password = "Yikes_hardcoded_PW"; 

Configure git ignore para este archivo de configuración.

+1

Las configuraciones están en otro archivo y sí git puede ignorar los archivos, pero eso no responde mi pregunta. – T9b

-1

No hay un problema con la codificación de las credenciales en un archivo de configuración necesariamente.

Para un proyecto versionado con código fuente, debería considerar crear una plantilla de configuración con marcadores de posición para cualquier credencial que envíe a su repositorio.

En cualquier implementación, debe editar estos marcadores de posición para que sean las credenciales activas de pago y envío. Esto también ayudará a cualquier persona que use su proyecto si va a abrirlo.

Actualizado (para realmente responder a la pregunta)

configuración

base de datos realmente tiene por qué ser en texto plano, hardcoded en un archivo PHP, sin embargo lo hace puede alguna cosa para asegurarse de que es más seguro:

  1. verifique su configuración de Apache del open_basedir restringe otros casos vhost de acceder a los archivos fuera de su raíz web
  2. comprobación de permisos de sistema de archivos para garantizar que sólo apache y el usuario puede acceder al archivo
  3. Asegúrese de que el usuario de MySQL sólo se establece para ser válido desde un contexto localhost, es decir grant all privileges on mydatabase.* to [email protected] etc
  4. uso de un firewall para bloquear las conexiones externas a mysql
+0

La cuestión no es sobre el aspecto de la versión, se trata de asegurar la contraseña de alguna manera para usar con PHP. ¿Me puede dar un ejemplo que responda la pregunta? – T9b

+0

Asegúrate de que tus permisos del sistema de archivos sean correctos y eso es todo lo que realmente importa. Siempre y cuando solo tú y apache puedan acceder a él, estarás bien. También asegúrese de que su configuración de configuración abierta en apache sea correcta. Además, si tu declaración de usuario mysql create user only local @ localhost será aún más segura –

1

Vas a tener que codificar la contraseña o alguna parte otro. Incluso si desea usar DSN, tendrá que codificar la contraseña en la cadena de DSN. Como lo veo, no hay forma de evitar codificar la contraseña.

Así que la pregunta se reduce a qué se puede hacer para proteger el archivo/cadena que contiene la contraseña. Establecer los permisos adecuados del sistema de archivos para el archivo que contiene la contraseña y establecer el valor correcto de open_basedir es lo que puede hacer. Como se mencionó en una de las publicaciones en What's best way to secure a database connection string?, también podría considerar usar una partición cifrada.

El enlace que ha publicado en su pregunta, en mi opinión, habla sobre aplicaciones de escritorio. Y las aplicaciones de escritorio en PHP son demasiado pocas para pensar seriamente en la cuestión de asegurar contraseñas de base de datos para aplicaciones de escritorio php.

1

Yo también estoy investigando sobre este tema. El permiso de archivo es una de las estrategias, pero hay tantos vectores.

Pero supongamos que en un escenario tiene acceso FTP o SSH al servidor y alguien pone en peligro el inicio de sesión de FTP. Este inicio de sesión es el mismo para la carpeta public_html de la cuenta del usuario. Esa persona podría navegar y leer estos archivos. Casi en este punto es malo. Sin embargo, podría tener una configuración en el sistema donde encarcela al usuario únicamente en su directorio de inicio.

Quizás entonces podría crear una carpeta .private en un nivel fuera del directorio de inicio de ese usuario. Luego, en los archivos php para ese usuario, que tiene sus scripts en public_html, incluya un archivo de conexión que exista en la carpeta .private (../../private/connect.php, por ejemplo).

No sé si esto funcionará si el usuario es encarcelado, pero este tipo de cosas parecen una seguridad a través de la oscuridad.

1

Basándose en lo que Cajus Kuinzinas eludió ... Considere tener una base de datos restringida que almacene las credenciales de la aplicación. Cuando se inicia la aplicación, ejecute una consulta con una cuenta de solo lectura que pueda buscar credenciales en la base de datos de la aplicación real.

Para hacerlo más seguro, el valor almacenado en la base de datos de búsqueda no debe ser la contraseña completa. Su aplicación podría actualizar este valor junto con un salt para generar la contraseña real. Además, puede guardar esto en la memoria caché, si lo desea, para reducir los éxitos futuros.

Cuestiones relacionadas