El Àgora se cerró. Aquí un archivo de lo que fue Tuesday January 23, 2018.

Protected/models/Backup.php: mysqldump no escapa correctamente contraseñas

jero

Algunas contraseñas con caracteres especiales generar errores en el método de backup mysqldump. Presente en OCAx-1.2.x
Una micromodificación para solucionarlo (adjunto patch)

177,178c177,178
< $command = 'mysqldump --user='.$params['user'].' --password=\''.$params['pass'].
< 		'\' --host='.$params['host'].' '.$params['dbname'].' '.$table.' > '.$filePath;
---
> 	$command = 'mysqldump --user='.$params['user'].' --password='.$params['pass'].
> 		' --host='.$params['host'].' '.$params['dbname'].' '.$table.' > '.$filePath;

Saludos!

jero

Los novatos no podemos adjutar archivos, inline patch (:

 --- ocax-1.2.2/protected/models/Backup.php      2015-07-24 17:50:02.000000000 +0200
+++ Backup.php  2015-07-25 14:07:08.758807986 +0200
@@ -174,8 +174,8 @@
                        case 'native':
                                $output = NULL;
                                $return_var = NULL;
-                               $command =      'mysqldump --user='.$params['user'].' --password='.$params['pass'].
-                                                       ' --host='.$params['host'].' '.$params['dbname'].' '.$table.' > '.$filePath;
+                               $command =      'mysqldump --user='.$params['user'].' --password=\''.$params['pass'].
+                                                       '\' --host='.$params['host'].' '.$params['dbname'].' '.$table.' > '.$filePath;
                                exec($command, $output, $return_var);
                                if($return_var)
                                        return 'exec(mysqldump) returned:'.$return_var;
chris

Hola @jero Bienvenido!

Ya no eres novato. Y como que eres el primero que sube un patch al ágora, tampoco aceptaba *diff files. Ahora sí. (en teoria).

Gracias! smile
Chris.

chris

@jero
Veo que sí, pero por curiosidad, ¿que caracteres usabas?
No puedo provocar el error.

Chris.

jero

Dependiendo de la shell del servidor, creo que cualquiera de estos caracteres genera el problema:

* ? [ < > & ; ! | $ ( ) ' "

y si usas herramientas como

$ apg -a 1 -m 16 -x 16

para generar contraseñas las probabilidades son muy altas (:
Repasando el parche que he enviado, en realidad no resuelve toda la cuestión:

  1. si contraseña contiene comilla sencilla, debe encerrarse en comillas dobles
  2. si contraseña contiene comilla doble, debe encerrarse en comillas sencillas
  3. cualquier otro caso, comillas simples

Solo probado en OpenBSD 5.7 ksh 5.2.14 y Ubuntu 14.04.2 LTS GNU bash 4.3.11(1)

saludos!

jero

Después de soltar el tostón anterior, caigo en la cuenta de las funciones de php para escapar comandos o argumentos que van a ser ejecutados en shell de sistema: escapeshellcmd() y escapeshellarg()
http://php.net/manual/es/function.escapeshellarg.php