Respaldo de bases de datos en PostgreSQL

Para realizar un respaldo de alguna base de datos en PostgreSQL se utiliza el comando pg_dump.

Les voy a compartir un pequeño pero útil script en bash para respaldar nuestra base de datos de forma automática y por fechas.

Lo primero que debemos hacer es crear una carpeta por ejemplo llamada “respaldos” y dentro de ahí, crearemos 7 carpetas más, con el nombre de los días de la semana, ejemplo: dom, lun, mar, mie, jue, vie, sab.

Ahora creamos el script:

#!/bin/bash
DB="shop"
DIA_ACTUAL=`date +%a`
FECHA_ACTUAL=`date +%Y-%m-%d`
HORA_ACTUAL=`date +%H:%M`
ARCH_RESP="$FECHA_ACTUAL--$HORA_ACTUAL"
DIR_RESP="/home/antonio/respaldo"
pg_dump -o -f $DIR_RESP/$DIA_ACTUAL/$DB-$ARCH_RESP.sql shop

Lo único que tienen que cambiar, es la variable DB, ahí va el de su base de datos y en la variable DIR_RESP va la ruta en tu carpeta resplados, con ésto cada vez que se ejecute dicho script, se creará un archivo llamado:

shop-2008-12-12–13:31.sql

Y lo pondrá en su respectiva carpeta deacuerdo al día, éste script lo puedes poner en la carpeta /etc/cron.daily para que se ejecute cada día.

0 Comments

Consulta segura en MySQL y PHP

sql_injection

Al momento de desarrollar una aplicación con base de datos, se debe tomar en cuenta la seguridad del mismo, uno de los ataques más comunes es el sql injection que consta básicamente de introducir código sql en cajas de texto de nuestro sistema con el fin de introducirse ó sacar información.

Un ejemplo de sql injection sería el siguiente:

<?php
// Consultar la base de datos para verificar si hay una coincidencia de usuario
$consulta = "SELECT * FROM usuarios WHERE usuario='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($consulta);
//Supongamos que el usuario tecleó ' OR ''=' en el campo de password:
$_POST['username'] = 'admin';
$_POST['password'] = "' OR ''='";

// Esto quiere decir que la consulta enviada a MySQL seria:
echo $consulta;
?>

La variable $consulta contendría:

SELECT * FROM usuarios WHERE usuario='aidan' AND password='' OR ''=''

Esto permitiría a cualquier usuario ingresar al sistema sin password.

Para realizar una consulta segura, utilizaremos 2 funciones mysql_real_escape_string y sprintf, se pudiera resolver también modificando la configuración del php para no permitir caracteres especiales, pero ésto sería una desventaja, ya que no permitiría la portabilidad del código.

<?php
// Conexion
$enlace = mysql_connect('mysql_host', 'mysql_usuario', 'mysql_contraseña')
    OR die(mysql_error());
//Consulta segura
$query = sprintf("SELECT * FROM libros WHERE autor='%s'", mysql_real_escape_string($autor_nombre));

mysql_query($query);
?>

Ojo, si no hay una conexión con el servidor, la función mysql_rea_space_string marcará un error.

En caso de una consulta de logeo:

<?php
// Función para eliminar "/" y añadir comillas
function comillas_inteligentes($valor)
{
// Retirar las barras
    if (get_magic_quotes_gpc()) {
        $valor = stripslashes($valor);
    }

 // Colocar comillas si no es entero
    if (!is_numeric($valor)) {
        $valor = "'" . mysql_real_escape_string($valor) . "'";
    }
    return $valor;
}

// Conexion
$enlace = mysql_connect('mysql_host', 'mysql_usuario', 'mysql_contraseña')
    OR die(mysql_error());

//consulta segura
$consulta = sprintf("SELECT * FROM usuarios WHERE usuario=%s AND password=%s",
            comillas_inteligentes($_POST['username']),
            comillas_inteligentes($_POST['password']));

mysql_query($consulta);
?>
1 Comment

Conexión Ruby con PostgreSQL

Este el el código para realizar una conexión en ruby con el motor de base de datos PostgreSQL.

#!/usr/bin/env ruby
require 'postgres'
conn = PGconn.connect("localhost", 5432, '', '', "test", "myid", "mypass")
res  = conn.exec('select tablename, tableowner from pg_tables')
res.each do |row|
	row.each do |column|
		print column
		(20-column.length).times{print " "}
	end
	puts
end
0 Comments

Mono C# con PostgreSQL

Ahora les voy a mostrar un pequeño ejercicio para trabajar con mono y el motor de base de datos PostgreSQL, si aún no tienes instalado Postgre ni mono puedes visitar estos tutoriales:
Instalación PostgreSQL, Comenzando con mono.

Para comenzar nos descargaremos la dll necesaria para trabajar con PostgreSQL en .NET, Npgsql.dll.

Ahora en monodevelop, creamos un proyecto nuevo en C# a modo consola, ahora del lado derecho donde dice Referencias, damos click derecho y seleccionamos Editar preferencias, una vez ahí, seleccionamos la dll y la añadimos al proyecto.

postgre

Para continuar, necesitamos crear una base de datos en postgre, podemos empezar con una tabla pequeña, para el ejercicio, hice una base de datos llamada ejercicio, con una tabla llamada usuarios que solamente contiene 3 campos, id, nombre y apellido.

Ahora entraremos a la parte de la programación, antes que nada, necesitamos agregar la librería necesaria al proyecto:

using Npgsql;

Enseguida crearemos algunos métodos de conectar, ejecutar y desconectar, para reducir código:
Método conectar()

namespace conexion
{
	class Postgre
	{
		public NpgsqlConnection dbcon; //Variable pública del tipo NpgsqlConnection

		public void conectar() //Método conectar
		{
	   string con = "Server=127.0.0.1;"+
      "Port=5432;"+
      "User Id=tu_usuario;"+
      "Password=tu_password;"+
      "Database=ejercicio;";	//Cadena para la conexión, modificar según tu user y password.

			dbcon = new NpgsqlConnection(con);
			dbcon.Open();
                }

Método ejecutar(string query)

public void ejectuar(string query)
		{
			NpgsqlCommand command = dbcon.CreateCommand();
			command.CommandText = query;
			command.ExecuteReader();

		}

Método Main()

public static void Main(string[] args)
		{
			try{
			Postgre conexion;
			conexion = new Postgre();
			conexion.conectar();
			Console.WriteLine("Conexión exitosa");
			string query = "INSERT INTO usuarios VALUES ('C01','Juan','Perez');";
			conexion.ejectuar(query);
			Console.WriteLine("Se ingreso el dato satisfactoriamente");
			Console.WriteLine("Visita http://www.antoniomtz.org");
		       }
		catch(NpgsqlException error)
			{
			string mensaje = error.Message;
			Console.WriteLine(mensaje);
			}
	}

Aquí les dejo el código completo : Conexión.

Espero y les haya servidor, saludos.

1 Comment

Mono + MySql , Altas y bajas

Con motivo de seguir aprendiendo a utilizar herramientas libres, he realizado un pequeño proyecto de altas y bajas utilizando el IDE Monodevelop con el motor de base de datos MySql.

Vamos a comenzar por explicar como conectar MySql con Mono. Para ello necesitaremos descargarnos la siguiente dll. Download MySql.dll.

Instalamos MySql.Dada.dll tecleando en consola:

# gacutil -i MySql.Data.dll

Creamos un nuevo proyecto y del lado izquierdo damos click derecho donde dice Referencias y le damos en Editar preferencias… .


mysql-1

En la pestaña de paquetes, palomeamos donde dice System.Data


mysql-2

Pasamos a la pestaña de Ensamblado .NET y buscamos el archivo MySql.Data.dll , lo seleccionamos y presionamos el botón Añadir.

mysql-3

Ahora solamente faltaría añadir unas librerias ya en nuestro proyecto:
Using System.Data;
Using MySql.Data.MySqlClient;


mysql=4

Con ello ya podemos empezar a programar y conectar a MySql. Como primera práctica que realicé, hice un pequeño proyecto de Altas y Bajas.

menu insertar lista abc

El programa es algo sencillo y esta algo verde, pero como primer programa creo que es muy útil ya que viene lo esencial para comenzar a realizar un proyecto grande.

Para correr bien el programa, hay que crear una nueva base de datos llamada prueba y crearle una tabla con el siguiente script:

CREATE TABLE IF NOT EXISTS `usuarios` (
  `id` int(10) NOT NULL,
  `nombre` varchar(150) collate latin1_spanish_ci NOT NULL,
  `apellidos` varchar(200) collate latin1_spanish_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci COMMENT='Tabla de Usuarios';

Como ven, es una tabla sencilla de tan solo 3 campos, id qué es el número de control de usuario a ingresar, el campo de nombre y apellido. Hay que modificar la sección de conexión con su nombre de usuario y password de mysql. Creo que no debe de haber ningún problema para entender el programa, algunas partes les puse comentarios para ir explicandolas, aquí dejo algunas operaciones que creo son las más importantes:

Sección de conexión con la base de datos:

string conexion =
          "Server=localhost;" +
          "Database=prueba;" +
          "User ID=root;" +
          "Password=tupass;" +
          "Pooling=false";
       IDbConnection dbcon;
       dbcon = new MySqlConnection(conexion);
       dbcon.Open();

Sección de insertar usuario, donde control, nombre y apellido son tomados de cajas de texto:

IDbCommand dbcmd = dbcon.CreateCommand();
string sql= "INSERT INTO `prueba`.`usuarios` (`id` ,`nombre` ,`apellidos`) VALUES ( '"+ control +"' ,'"+ nombre +"','"+ apellido +"');";
           dbcmd.CommandText= sql; //se manda el query
	   dbcmd.ExecuteReader();  // se ejecuta el query
	   dbcon.Close();          // se cierra la conexión

Eliminar usuario:

IDbCommand dbcmd = dbcon.CreateCommand();
string sql = "DELETE FROM `usuarios` WHERE `usuarios`.`id` = '"+ control +"';";
		dbcmd.CommandText= sql;
		dbcmd.ExecuteReader();
		dbcon.Close();

Aquí les dejo el proyecto para la descarga, espero y les sea de utilidad, queda libre de modificaciones y mejoras.


Download

7 Comments
Page 1 of 212