Aclarando:
Primero:
Código :
esto:
$datos['nombre'] = $_POST['nombre'];
$datos['apellido'] = $_POST['apellido'];
lo puedes hacer asi:
$datos = $_POST;
Segundo:
Tu aplicacion de verdad necesita hacer un numero tan increible de
distintos querys como para querer automatizar completamente la fabricacion de los querys?. Lo haces para no tener que escribirlos? Si es asi dejame decirte que pasaras mas tiempo pensando en como NO te dañen tu base de datos (y por ende escribiendo codigo) que lo que tardarias en escribir cada query independientemente (Aun asi te pueden joder la DB) (checate la historia de la funcion stripslashes.
tercero:
Es completamente posible alterar el formulario para agregar nuevas casillas y enviar nuevos datos y valores. La extencion webdeveloper o firebug de firefox te permite hacerlo. El HTTP_REFERER no te protegeria de mucho porque esa es una variable que manda
el cliente.
NUNCA DEJES LA SEGURIDAD EN MANOS DEL CLIENTE . Ademas no pienses que el metodo POST te da mas seguridad que el metodo GET.
Alguien concientemente intencionado en atacarte no encontrara ninguna diferencia.
cuarto:
encriptacion de los formularios? Nunca he visto eso y de cualquier forma tendria que ser leible por el lado cliente asi que puede ser modificado. Ademas un framework decente aunque puede que si fabrique querys mas dinamicamente tambien lo hace mas inteligentemente. Yo uso un framework desarrollado entre varios colegas que esta enfocado a la estructura de las bases de datos y aun asi siempre procuro hacer que entren solo los datos que deben. Te pongo un estracto de como usaria mi framework para por ejemplo agregar una noticia.
Código :
class Union_Noticia extends io_Object {
public $catName;
public $cat = array();
function setUp(){
$this->table = 'noticias';
$this->loadFromTableDB($this->table,'not_');
function agregarNoticia(){
$this->id = $_POST['id']:
$this->content = $_POST['content']:
}
}
ahora, tambien tengo la forma the hacer $this->loadfromPOST(); pero eso solo lo uso cuando el formulario lo genera un motor.
quinto:
Si, es inteligente tu aporte pero de que sirve que especifiques el tipo de datos que contendra tu DB si aun asi el atacante no quedra meter otro tipo de datos, o si?. Me explico, si tienes un campo ADMIN con un valor boolean. Obviamente ahi solo puede haber o 1 o 0. Si vas a impedir que segun el tipo de dato se ejecute el query pues lo que harias es un "verificador de que tu atacante ha hehco las cosas bien para asi ejecutar el query). En otras palabras solo cuando el ataque sea efectivo tu dejarias que tuviera exito. Tienes que hacer lo contrario. Cuando el ataque sea efectivo impedir que tenga exito.
sexto:
Show columns te da todas las columnas de la db inclusive las que no deberian de editarse.
enfin:
simplificando todo yo me inclino por la idea de dano. Sin embargo nunca recuerdo haber hecho eso. En un proyecto viejo (www.asterisk2billing.org) recuerdo que creamos un archivo con todos los querrys que usabamos con define() y simplemente pasabamos el querry como array. Era practico.
En fin, son consideraciones.