2009-07-26 18 views

Respuesta

23

Si su aplicación solo está calculando md5 cuando alguien se registra en su sitio, o inicia sesión, ¿tendrá muchas llamadas por md5 por hora? ¿Par de cientos? Si es así, no creo que la diferencia realmente pequeña sea significativa entre PHP y MySQL.

La pregunta debería ser más como "¿dónde pongo el hecho de que la contraseña se almacena utilizando md5" que "lo que me hace ganar casi nada".

Y, como nota al margen, otra pregunta podría ser: ¿dónde puede permitirse gastar recursos para ese tipo de cálculos? Si usted tiene 10 servidores PHP y un servidor de base de datos ya bajo carga pesada, que obtener su respuesta ;-)

Pero, sólo por diversión:

mysql> select benchmark(1000000, md5('test')); 
+---------------------------------+ 
| benchmark(1000000, md5('test')) | 
+---------------------------------+ 
|        0 | 
+---------------------------------+ 
1 row in set (2.24 sec) 

Y en PHP:

$before = microtime(true); 
for ($i=0 ; $i<1000000 ; $i++) { 
    $a = md5('test'); 
} 
$after = microtime(true); 
echo ($after-$before) . "\n"; 

da:

$ php ~/developpement/tests/temp/temp.php 
3.3341760635376 

Pero probablemente no estés calculando un millón de md5 como este, ¿o sí?

(Y esto no tiene nada que ver con la prevención de las inyecciones SQL: acaba de escapar/presupuesto sus datos siempre o usar comandos preparados!)

+6

Cuando todo lo demás falla, realice un experimento. – Rafe

+2

por lo que ahorrará aproximadamente un microsegundo haciéndolo en la base de datos en lugar de hacerlo en php. suena bastante insignificante, pero es interesante saber – Kip

+1

+1 para una respuesta muy completa y un punto importante acerca de las inyecciones de SQL :) – Draemon

4

No sé cuál es más rápido, pero si lo haces en PHP, evitas la posibilidad de inyección SQL.

+1

En cualquier caso, hago mysql_real_escape_string en mis $ pwd params. –

+1

Esto no tiene nada que ver con eso. Una declaración preparada arreglaría esto sin mover la función MD5, también está confiando en la función PHP MD5 para "escapar" la contraseña. – Draemon

+1

@Draemon: no dije que no hubiera otras formas de evitarlo, pero el ejemplo no da ninguna indicación de que se haya escapado del parámetro. @hiam: si decides hacerlo en php, primero no debes escapar de la cadena de contraseña. La función md5 de php puede tomar cualquier cadena, y se garantiza que devolverá^[0-9a-f] {32} $ – Kip

0

Mídalo, es la única manera de estar seguro.

3

¿El rendimiento es realmente un problema aquí? Es probable que sea marginal.

  • Hacerlo en MySQL hace que el DB hacer más trabajo, lo cual es una buena cosa
  • Hacerlo en MySQL significa la contraseña sin cifrar se pasa más adelante (y la conexión DB es a menudo sin cifrar).
  • Esto no tiene nada que ver con la inyección SQL. Podría arreglar la primera versión sin mover la función MD5. Además, si hubiera un error en la función MD5 de PHP, aún existe la posibilidad de un ataque de inyección.
+2

¿Qué error en la función md5? ¿Esperas explotarlo de alguna manera y en lugar de 32 dígitos hexadecimales, algunos caracteres especiales y sentencias sql bien formadas? No va a pasar. – lacop

+1

Ese es exactamente el tipo de actitud que lleva a los exploits. No debe usar funciones arbitrarias y esperar que desinfecten sus datos. ¿Qué pasa si alguien elimina el requisito de MD5 en algún momento? ¿Se darán cuenta de que los datos no son seguros? – Draemon

+1

Esto es simplemente una tontería, no se puede confiar incluso en ninguna función de escape, o llevarla a cualquier función extrema. Incluso php sí mismo o mysql pueden ser con errores. Entonces, la única manera de evitar exploits es no escribir ningún código. – lacop

0

diría, leer el valor de columna de MySQL, a continuación, comparar el resultado con el hash calculado en su código de cliente (por ejemplo, php).

La razón principal para hacer esto es que evita cosas estúpidas como la base de datos que recopila la columna de una manera no binaria (por ejemplo, insensible a mayúsculas y minúsculas, etc.), que generalmente no es deseable para un hash.

Cuestiones relacionadas