¿Cómo proteger los nombres de usuario y las contraseñas de la base de datos MySQL dentro de un archivo php? [duplicar]

3

Estoy trabajando en un sitio web de PHP y mis investigaciones demostraron que es completamente posible que el servidor pueda ser pirateado y que los archivos PHP puedan quedar expuestos. Almaceno el nombre de usuario y la contraseña de MySQL DB dentro de los archivos PHP en forma de constantes, que luego se usan para formar la cadena de conexión.

define("HOSTNAME","hostname.com:2086");
define("DBNAME","databasename");
define("DBUSER","databaseusername");
define("DBPASS","databasepassword!");

/* Defining DB Handler */
try{
    $DBH = new PDO("mysql:host=".HOSTNAME.";dbname=".DBNAME, DBUSER, DBPASS);
    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $DBH->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
}
catch(PDOException $e){
    echo $e->getMessage();
}

Si, en cualquier caso, los archivos PHP se exponen, esto causaría que la base de datos y su contenido también estén en riesgo. ¿Lo estoy haciendo mal? ¿Existe una mejor manera de garantizar la seguridad de la base de datos incluso si se exponen los archivos PHP?

    
pregunta BlackPanther 25.05.2015 - 13:28
fuente

4 respuestas

4

Una buena forma de proteger tus claves es colocar el archivo php con las credenciales fuera de webroot.  Incluso cuando los archivos php 'sin procesar' se sirven a un cliente, ninguno de ellos incluye las credenciales de la base de datos. (no protege contra alguien con acceso a archivos en el servidor).

Otra medida defensiva que puede tomar es limitar las conexiones desde las que la base de datos acepta conexiones. (así que no todo el mundo, sino solo una lista selecta de direcciones IP específicas)

Por último, debe hacer que la cuenta que se conecta con la base de datos solo tenga derechos sobre su propia base de datos, ¡y ninguna otra!

    
respondido por el LvB 25.05.2015 - 13:40
fuente
4

Defensa en profundidad es la palabra clave: en lugar de solo asegurar las credenciales, asegúrese de que incluso saber las credenciales es (casi ) inútil para un atacante.

Eso significa que utilice un usuario dedicado con los privilegios menos necesarios ( principio de privilegio mínimo ) y restringir el acceso con ese usuario solo desde el servidor web. Entonces, realmente no importa dónde se guardan las credenciales, ya que la única forma en que un atacante puede explotar estas credenciales es desde el servidor web, lo que significa que requiere la ejecución de código / comando en el servidor web. Y en ese caso ya estás condenado.

    
respondido por el Gumbo 25.05.2015 - 14:27
fuente
0

Lo que haría, además de las medidas mencionadas en las otras respuestas, es leer el nombre de usuario / contraseña de un archivo que se recuperará del servidor web y tener este archivo en una lista negra explícita para todos menos el servidor.

    
respondido por el Martin Argerami 25.05.2015 - 16:03
fuente
0

Puedes ponerlas en variables de entorno.

Además del pequeño beneficio de seguridad, brindan múltiples ventajas para su flujo de trabajo de desarrollo, como no tener que tocar archivos PHP e insertar diferentes credenciales cada vez que quiera trabajar en un entorno de desarrollo diferente. En su lugar, el entorno proporciona esta información y solo tiene una aplicación única que se adapta automáticamente a donde sea que se implementa.

    
respondido por el user42178 25.05.2015 - 16:33
fuente

Lea otras preguntas en las etiquetas