tech > code > adventures in code > Bastardizing a Backup
2 Nov 2008 16:11 EST
the goal
The goal of this code was simple. I wanted to be able to either hit a PHP page on a webserver, or plug the pinging of it into a cron script, and the PHP file would dump the MySQL databases, and automatically upload them to another server for backup.
what went wrong
Two things went wrong.
- I couldn't get the upload to work. I couldn't get the FTP code in the PHP script to upload the file - it was just creating a 0-sized file.
- I wasn't paying attention to what I was doing. I was setting up Compiz-Fusion on my new gentoo box while doing this, and thus the code was written between compiles. I wasn't thinking about anything other than "okay that won't work, what will? hm yea I think that might do it..."
the outcome
the code
This code contains numerous security holes, in addition to a horrible design. You should not use it.
backup.php
$db_host="localhost"; $db_user=""; $db_pass=""; $db_connection = mysql_connect($db_host, $db_user, $db_pass) or die("Could not connect to database"); $dbs = mysql_list_dbs($db_connection) or die("Could not list databases"); $dblist = ""; while($db_row = mysql_fetch_object($dbs)) { $db = $db_row->Database; $dblist .= " " .$db; } mysql_close($db_connection); $filename = "mysqlbackup-".date("Y-m-d--G-i-s"); exec("mysqldump --opt --u=$db_user --password=$db_pass --databases $dblist > $filename", $out); exec("gzip $filename"); $url = "http://backupserver/wget.php?file=".urlencode("http://thisserver/".$filename.".gz")."&callback=".urlencode("http://thisserver/callback.php?file=".$filename.".gz"); $urlH = fopen($url, 'r'); while($l = fread($urlH, 32764)); fclose($urlH);
wget.php
$get = urldecode($_GET['file']); if(strlen($get) < 3) die("no file specified"); if(strpos($get, "mysqlbackup") === false) die("sneaky sneaky!"); $callback = urldecode($_GET['callback']); if(strlen($callback) < 3) die("no callback specified"); $time = date("Y-m-d--G-i-s-"); $hsl = fopen($time."handshakelist.txt", 'w') or die("could not open handshakelist"); fwrite($hsl, $get . "\n"); fwrite($hsl, $callback); fclose($hsl); system("wget -b -a wgetscript.log -nv -i ".$time."handshakelist.txt") unlink($time."handshakelist.txt");
callback.php
$file = urldecode($_GET['file']); if(strpos($file, "mysqlbackup") === false) die("sneaky sneaky!"); unlink($file);
required, hidden, gravatared
required, markdown enabled (help)
* item 2
* item 3
are treated like code:
if 1 * 2 < 3:
print "hello, world!"
are treated like code: