Cuando una aplicación PHP realiza una conexión de base de datos, por supuesto, generalmente necesita pasar un nombre de usuario y contraseña. Si estoy usando un inicio de sesión único con permiso mínimo para mi aplicación, entonces el PHP necesita saber ese inicio de sesión y contraseña en alguna parte. ¿Cuál es la mejor manera de asegurar esa contraseña? Parece que escribirlo en el código PHP no es una buena idea.
404
Respuestas:
Varias personas interpretaron mal esto como una pregunta sobre cómo almacenar contraseñas en una base de datos. Eso está mal. Se trata de cómo almacenar la contraseña que le permite acceder a la base de datos.
La solución habitual es mover la contraseña del código fuente a un archivo de configuración. Luego, deje la administración y asegure ese archivo de configuración a los administradores de su sistema. De esta forma, los desarrolladores no necesitan saber nada sobre las contraseñas de producción, y no hay registro de la contraseña en su control de origen.
fuente
Si está alojado en el servidor de otra persona y no tiene acceso fuera de su raíz web, siempre puede poner su contraseña y / o conexión de base de datos en un archivo y luego bloquear el archivo usando un .htaccess:
fuente
La forma más segura es no tener la información especificada en su código PHP.
Si está utilizando Apache, eso significa establecer los detalles de conexión en su httpd.conf o archivo de host virtual. Si lo hace, puede llamar a mysql_connect () sin parámetros, lo que significa que PHP nunca generará su información.
Así es como especifica estos valores en esos archivos:
Luego abres tu conexión mysql así:
O así:
fuente
ini_get()
.but any user (or a hacker abusing badly written php script) can read the password via ini_get()
¿Cómo lidias con esto?ini_get()
ogetenv()
.Almacénelos en un archivo fuera de la raíz web.
fuente
include('../otherDirectory/configfile.conf')
?Para sistemas extremadamente seguros, encriptamos la contraseña de la base de datos en un archivo de configuración (que a su vez está protegido por el administrador del sistema). Al iniciar la aplicación / servidor, la aplicación solicita al administrador del sistema la clave de descifrado. La contraseña de la base de datos se lee del archivo de configuración, se descifra y se almacena en la memoria para su uso futuro. Todavía no es 100% seguro ya que está almacenado en la memoria descifrada, ¡pero en algún momento debe llamarlo 'lo suficientemente seguro'!
fuente
Esta solución es general, ya que es útil para aplicaciones de código abierto y cerrado.
Ventajas:
Heroku, que tiene mucho éxito, sugiere este método.
fuente
si es posible crear la conexión de la base de datos en el mismo archivo donde se almacenan las credenciales. Incluya las credenciales en la declaración de conexión.
De lo contrario, es mejor desarmar las credenciales después de la instrucción de conexión, porque las credenciales que no están en la memoria no se pueden leer desde la memoria ;)
fuente
Sus opciones son un poco limitadas, ya que dice que necesita la contraseña para acceder a la base de datos. Un enfoque general es almacenar el nombre de usuario y la contraseña en un archivo de configuración separado en lugar del script principal. Luego, asegúrese de almacenarlo fuera del árbol web principal. Eso fue si hay un problema de configuración web que deja que sus archivos php simplemente se muestren como texto en lugar de ejecutarse, no ha expuesto la contraseña.
Aparte de eso, está en la línea correcta con un acceso mínimo para la cuenta que se está utilizando. Añadir a eso
Peter
fuente
Si está utilizando PostgreSQL, busca las
~/.pgpass
contraseñas automáticamente. Vea el manual para más información.fuente
Anteriormente almacenamos el usuario / pase de DB en un archivo de configuración, pero desde entonces hemos alcanzado el modo paranoico, adoptando una política de Defensa en profundidad .
Si su aplicación se ve comprometida, el usuario tendrá acceso de lectura a su archivo de configuración y, por lo tanto, existe la posibilidad de que un cracker lea esta información. Los archivos de configuración también pueden quedar atrapados en el control de versiones o copiarse en servidores.
Hemos pasado a almacenar las variables de entorno de usuario / pase establecidas en Apache VirtualHost. Esta configuración solo puede ser leída por el usuario root. Esperemos que su usuario de Apache no se ejecute como usuario root.
La desventaja con esto es que ahora la contraseña está en una variable PHP global.
Para mitigar este riesgo, tenemos las siguientes precauciones:
phpinfo()
está desactivado. PHPInfo es un objetivo fácil para obtener una visión general de todo, incluidas las variables de entorno.fuente
Coloque la contraseña de la base de datos en un archivo, haga que sea de solo lectura para el usuario que sirve los archivos.
A menos que tenga algún medio para permitir que el proceso del servidor php acceda a la base de datos, esto es prácticamente todo lo que puede hacer.
fuente
Si habla de la contraseña de la base de datos, a diferencia de la contraseña que proviene de un navegador, la práctica estándar parece ser poner la contraseña de la base de datos en un archivo de configuración de PHP en el servidor.
Solo necesita asegurarse de que el archivo php que contiene la contraseña tenga los permisos adecuados. Es decir, debe ser legible solo por el servidor web y por su cuenta de usuario.
fuente
Simplemente ponerlo en un archivo de configuración en algún lugar es la forma en que generalmente se hace. Solo asegúrate de que:
fuente
Lo hemos resuelto de esta manera:
fuente
Un truco adicional es usar un archivo de configuración de PHP separado que se vea así:
Esto no le impide establecer las reglas de acceso correctamente. Pero en el caso de que su sitio web sea pirateado, un "requerir" o un "incluir" simplemente saldrá del script en la primera línea, por lo que es aún más difícil obtener los datos.
Sin embargo, nunca permita que los archivos de configuración se encuentren en un directorio al que se pueda acceder a través de la web. Debe tener una carpeta "Web" que contenga su código de controlador, css, imágenes y js. Eso es todo. Todo lo demás va en carpetas sin conexión.
fuente
require
/include
pero ¿cómo evitar que lo hagafopen
?¡La mejor manera es no almacenar la contraseña en absoluto!
Por ejemplo, si está en un sistema Windows y se conecta a SQL Server, puede usar la autenticación integrada para conectarse a la base de datos sin una contraseña, utilizando la identidad del proceso actual.
Si necesita conectarse con una contraseña, primero encripte , usando un cifrado seguro (por ejemplo, usando AES-256, y luego proteja la clave de cifrado, o usando un cifrado asimétrico y haga que el sistema operativo proteja el certificado), y luego guárdelo en un archivo de configuración (fuera del directorio web) con ACL fuertes .
fuente