Comunidad de diseño web y desarrollo en internet online

Ayuda con clase que genera consultas.

Citar            
MensajeEscrito el 12 Oct 2010 06:37 am
Hola hice esta clase que sirve para generar consultas a base de datos. El tema que haora viene la parte de seguridad. y nunca toque a fondo ese tema. Hasi les pido que me ayuden con dicho tema para poder concluir mi clase. No esta de mas decir que una ves la termine, la boy a postear para el que le sirve.

Este es mi siguiente php que almacena la clase.

<?php
class query{


var $tip;
var $param;
var $value;
var $param_if;
var $value_if;
var $limit_param;
var $limit_value;
var $limit_param_if;
var $limit_value_if;
var $tabla;
var $consulta_string;
var $where_string;

function onQuery($tip_new){

$local = "localhost";
$root = "root";
$pass = "";
$db = "query";
mysql_connect($local, $root, $pass);
mysql_select_db($db);

$this->tip = $tip_new[0];
$this->tabla = $tip_new[1];
$this->param = $tip_new[2];
$this->value = $tip_new[3];
$this->param_if = $tip_new[4];
$this->value_if = $tip_new[5];
$this->limit_param = count($tip_new[2]);
$this->limit_value = count($tip_new[3]);
$this->limit_param_if = count($tip_new[4]);
$this->limit_value_if = count($tip_new[5]);

switch($this->tip){

case "insert":


if(($this->limit_param==$this->limit_value)){
function onGeneraConsult($tabla, $string){
$consulta = "INSERT INTO ".$tabla." SET ".$string."";
$res = mysql_query($consulta);
}
$array_value_consult = array();
for($i=0;$i<$this->limit_param;$i++){
$array_value_consult[$i] = $this->param[$i]."='".ucfirst(strtolower($this->value[$i]))."'";
if($i==(($this->limit_param)-1)){
$this->consulta_string = implode(", ", $array_value_consult);
onGeneraConsult($this->tabla, $this->consulta_string);
}
}
}else{
echo "Error.";
}


break;

case "delete":


if(($this->limit_param==$this->limit_value)){
function onGeneraConsult($tabla, $string){
$consulta = "DELETE FROM ".$tabla." WHERE ".$string."";
$res = mysql_query($consulta);
}
$array_value_consult = array();
for($i=0;$i<$this->limit_param;$i++){
$array_value_consult[$i] = $this->param[$i]."='".ucfirst(strtolower($this->value[$i]))."'";
if($i==(($this->limit_param)-1)){
$this->consulta_string = implode(" AND ", $array_value_consult);
onGeneraConsult($this->tabla, $this->consulta_string);
}
}
}else{
echo "Error.";
}


break;

case "update":


if(($this->limit_param==$this->limit_value)){
function onGeneraConsult($tabla, $string, $string_if){
$consulta = "UPDATE ".$tabla." SET ".$string." WHERE ".$string_if."";
$res = mysql_query($consulta);
}
$array_value_consult = array();
$array_value_if = array();
for($i=0;$i<$this->limit_param;$i++){
$array_value_consult[$i] = $this->param[$i]."='".ucfirst(strtolower($this->value[$i]))."'";
if($i==(($this->limit_param)-1)){
$this->consulta_string = implode(", ", $array_value_consult);

for($n=0;$n<$this->limit_param_if;$n++){
$array_value_if[$n] = $this->param_if[$n]."='".ucfirst(strtolower($this->value_if[$n]))."'";
if($n==(($this->limit_param_if)-1)){
$this->where_string = implode(" ADN ", $array_value_if);
onGeneraConsult($this->tabla, $this->consulta_string, $this->where_string);
}
}

}
}
}else{
echo "Error.";
}


break;

case "select":


if(($this->limit_param!=$this->limit_value)){
function onGeneraConsult($tabla, $string, $string_if){
$consulta = "SELECT ".$string." FROM ".$tabla." WHERE ".$string_if."";
$res = mysql_query($consulta);
}
$array_value_consult = array();
$array_value_if = array();
for($i=0;$i<$this->limit_param;$i++){
$array_value_consult[$i] = $this->param[$i];
if($i==(($this->limit_param)-1)){
$this->consulta_string = implode(", ", $array_value_consult);

for($n=0;$n<$this->limit_param_if;$n++){
$array_value_if[$n] = $this->param_if[$n]."='".ucfirst(strtolower($this->value_if[$n]))."'";
if($n==(($this->limit_param_if)-1)){
$this->where_string = implode(" ADN ", $array_value_if);
onGeneraConsult($this->tabla, $this->consulta_string, $this->where_string);
}
}

}
}
}else{
echo "Error.";
}


break;

}

}

}
?>

La clase me anda exelente Tiene INSERT, DELETE, UPDATE, Y SELECT.

La uso de la siguiente forma.

Insert EJ:

$par = array("nombre", "apellido", "id");
$val = array("gonzalo", "telesio", "1");
$par_if = array();
$val_if = array();
$param = array("select", "data", $par, $val, $par_if, $val_if);
$obj = new query;
$obj->onQuery($param);

Espero me ayuden a mejorar la parte de seguridad de esta clase para que la consulta que se ejecute no pueda ser injectable.

Gracias desde ya.

Por sodyack

40 de clabLevel



 

Ninguno

firefox
Citar            
MensajeEscrito el 12 Oct 2010 06:42 am
En las ultimas 2 consultas puse ADN en ves de AND, ya lo arregle. :)

Por sodyack

40 de clabLevel



 

Ninguno

firefox
Citar            
MensajeEscrito el 12 Oct 2010 12:21 pm
Pues la verdad que es una clase bastante poco ortodoxa. No entiendo por qué la complicación de pasar todo mediante un array pero en fin, mientras tú te entiendas, yo contente :D.
Sobre tu pedido, cada vez que usas un string proporcionado por el usuario para formar una sentencia SQL deberías pasarlo por la función mysql_real_escape_string() como mínimo.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 13 Oct 2010 02:49 am
Hay esta el problema como hago eso?... Seguridad sql 0 yo. Es la primera ves que le doy bola. Respecto a esta clase la hise con el fin de aligerme el tema de las consultas. En el sentido Que Haorro a la larga codigo. Y no me preocupo de volver a escribir muchas cosas. Pero yo me entiendo.
Gracias por tu respuesta.

Por sodyack

40 de clabLevel



 

Ninguno

opera
Citar            
MensajeEscrito el 13 Oct 2010 04:08 pm
sodyack es un poco rara la clase que tienes, ¿haz considerado los Join, Limit, Distinct, etc...?

Regresando a tu clase solo tienes una función, crea otra donde analices los datos y revises si son validos:

Código PHP :

private function validar($valor){
... implementación de mysql_real_escape_string() u otras cosas.
}

PHP tiene un artículo muy completo de SQL Injections, que es de lo que te cuidarás.

Lo unico que tienes que hacer es mandar llamar esta función por cada parametro que tengas en tu función onQuery.

Código PHP :

function onQuery($tip_new){
...
$this->tip = $this->validar($tip_new[0]);
...
}

Creo que podrías darle un vistazo a la clase de Base de Datos de CodeIgniter para que te orientes un poco en el alcance que podrías tener.

Saludos.

Por Reymond

Claber

1111 de clabLevel

5 tutoriales
1 articulo

Genero:Masculino  

Mobile developer

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.