2010-02-27 18 views
11

Actualmente estoy trabajando en un sitio web para el grupo universitario de mi iglesia, y estoy empezando a preocuparme un poco por la seguridad de lo que estoy escribiendo. Por ejemplo, utilizo esta función:¿Cómo puedo asegurar mi conexión a la base de datos?

function dbConnect() 
    { 
    global $dbcon; 

    $dbInfo['server'] = "localhost"; 
    $dbInfo['database'] = "users"; 
    $dbInfo['username'] = "root"; 
    $dbInfo['password'] = "password"; 

    $con = "mysql:host=" . $dbInfo['server'] . "; dbname=" . $dbInfo['database']; 
    $dbcon = new PDO($con, $dbInfo['username'], $dbInfo['password']); 
    $dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $error = $dbcon->errorInfo(); 

    if($error[0] != "") 
    { 
    print "<p>DATABASE CONNECTION ERROR:</p>"; 
    print_r($error); 
    } 
    } 

para conectarme a la base de datos cada vez que hago una consulta de algún tipo. Siempre utilizo las declaraciones preparadas PDO para evitar la inyección de SQL de cualquier entrada del usuario, y utilizo htmlspecialchars para escapar antes de la salida. Mi pregunta es la siguiente: ¿Cómo protejo mi nombre de usuario y contraseña para mi base de datos? No sé si alguien puede ver la fuente de mis archivos PHP, pero si pudieran, solo puedo imaginar que me rociarán. ¿Qué debo hacer?

+0

Tiene toda la razón al preguntar esto. Skilldrick tiene la respuesta correcta: coloque datos confidenciales en un archivo fuera de la raíz del documento. Esta es en realidad una pregunta que hice a los candidatos cuando estaba contratando para un rol de PHP. – Draemon

+0

Otra cosa aquí, está IMPRIMIENDO una cadena de error de base de datos. Me gustaría llegar a un esquema de registro diferente para que en el entorno de producción no esté imprimiendo información como esta. Expone detalles sobre su sistema. Si se trata de su producción, conéctese a algo como syslog, un archivo o envíese un correo electrónico para que pueda revisarlo cuando lo desee. – Josh

+0

¿Hay alguna posibilidad de que alguien me señale la dirección correcta para buscar información sobre cómo colocar archivos fuera del directorio raíz de mi servidor web? @josh gracias por el heads-up. – JoeCortopassi

Respuesta

9

Debe poner las credenciales de su base de datos en un archivo fuera de la raíz del documento, por lo que si algo se estropea y su PHP se muestra a los usuarios sin analizar, nadie podrá ver su contraseña.

Tenga una mirada en this article on the subjectthis article on the subject:

La solución es simple.Coloque todos los datos confidenciales fuera de la raíz del documento de su servidor web. Muchos expertos ahora recomiendan ubicar la mayoría, si no la totalidad, de su código php fuera de la raíz del documento de su servidor web. Como PHP no está limitado por las mismas restricciones que su servidor web, puede crear un directorio en el mismo nivel que la raíz de su documento y colocar allí todos sus datos y códigos confidenciales.

+0

Exactamente. No contrataría un desarrollador PHP que no supiera esto. – Draemon

+0

¿Estás diciendo que debería ponerlo en un archivo php separado e incluirlo en el archivo de la página? ¿O algo totalmente diferente? – JoeCortopassi

+0

@Cortopasta: Eso es correcto, pero el archivo debe estar fuera de la raíz del documento. Estrictamente hablando, no es necesario que lo incluya: podría leerlo como un archivo de configuración, pero tradicionalmente sería otro archivo PHP. – Draemon

7

Ok, esto necesita alguna aclaración. Algunos han sugerido que coloque datos confidenciales fuera de la raíz del documento. Esto tiene un poco de mérito, pero es más placebo que cualquier otra cosa en la practicidad.

Tiene que considerar posibles fuentes de problemas.

  • Alguien con acceso de shell a la máquina pondrá en peligro la información de conexión de su base de datos, independientemente de dónde la coloque. Esto puede incluir tanto a usuarios autorizados como a aquellos que explotan una vulnerabilidad para obtener acceso al shell (esto ha sucedido mucho);

  • Si PHP está deshabilitado o el servidor web se deja engañar al pensar que es así, existe la posibilidad de que los archivos PHP se sirvan en forma cruda. Ponerlos fuera de la raíz del documento lo protegerá de esto;

  • Si alguien de alguna manera logra escribir un script PHP en la raíz del documento, es básicamente lo mismo que alguien con acceso al shell, por lo que ninguna medida lo protegerá.

En la práctica, si el servidor Web se ve comprometida es, los casos en los archivos de configuración se encuentran fuera de la raíz del documento se protegen usted es bastante improbable.

El principal punto de seguridad de las bases de datos es garantizar que alguien de Internet no pueda conectarse directamente. Esto se puede hacer con un firewall, vinculando la base de datos a una dirección IP privada o poniendo la base de datos en un servidor privado.

+0

Así que no estoy siendo descuidado/inseguro al codificar mi conexión de base de datos de esta manera? – JoeCortopassi

+0

@Cortopasta no, lo que estás haciendo es bastante estándar. – cletus

+0

Wow, esto está muy mal. Ver la respuesta de Skilldrick. – Draemon

3

Hay precauciones que puede tomar. Cree un usuario mySQL que sea específico para lo que su aplicación necesita para poder hacer. Esto puede limitar la cantidad de daño que un atacante puede hacer si ha comprometido su nombre de usuario y contraseña. Por ejemplo, permite al usuario insertar, actualizar, seleccionar, etc., pero NO soltar, etc. Además, como mencionó Cletus, la base de datos no debe ser accesible desde el exterior. En el entorno de alojamiento compartido, esto normalmente significa que solo se puede conectar el DB a su servidor www o localhost.

Re: kalpaitch, no pase su contraseña en algún hash reversible. La gente nunca debería ver tu fuente.

Cuestiones relacionadas