Evitar inyecciones sql en php

  • Autor Autor Martz
  • Fecha de inicio Fecha de inicio
M

Martz

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Buenas noches, tengo una duda como puedo hacer para evitar inyecciones de sql en php? Estoy utilizando sentencia preparada, pero con eso está bien? o le debo de agregar algo?, este es parte del código que utilizó:
Código PHP:
$query=$db->prepare('INSERT INTO persona(idArea, nombre) VALUES(?,?)');
$query->bind_param('is',$this->idArea,$this->nombre);
 
Esta correcto

Para prevenir la inyección SQL está correcto, y creo que estas empezando bien.

Las sentencias preparadas pueden usar variables de marca (?) y las interpreta como texto o entero segun como las definas en el BIND_PARAM, esto es bueno porque evita el código malicioso SQL, ya que si es texto todo lo interpreta como texto.

Si quieres profundizar más y ser más estricto puedes utilizar funciones o procedimientos almacenados dentro de la base de datos.

Las funciones y procedimientos almacenados (Store Procedure) son fragmentos de código (script) dentro de la base de datos (Mysql, MS SQL, Postgret, etc ) que limitan y restringen el acceso desde la aplicación y más aún desde FrontEnd.

Pero si estas comenzando y tu eres quien lleva el proyecto, estas muy bien con las sentencias preparadas. Cuando tu proyecto requiera más colaboradores, deberás empezar a incluir Stored Procedures y Funciones, para limitar a tus colaboradores a tener acceso a la Base de Datos y proteger tus datos ya no de los usuarios externos fuera de la web, sino de quienes trabajan contigo.

Dios te bendiga


Espero haber respondido
 
Trabajar con stored procedures es una filosofía muy antigua, que está cayendo en desuso. Ahora lo que se lleva es todo lo contrario, la abstracción del acceso a datos mediante capas como doctrine o active record. Incluso las bases de datos SQL están dejando lado a las NOSQL donde todo son hashes en memoria.

Hay que tener muy buenos motivos para programar un stored procedure y, desde luego, protegerse de los programadores del equipo no es un motivo aceptable.


Para prevenir la inyección SQL está correcto, y creo que estas empezando bien.

Las sentencias preparadas pueden usar variables de marca (?) y las interpreta como texto o entero segun como las definas en el BIND_PARAM, esto es bueno porque evita el código malicioso SQL, ya que si es texto todo lo interpreta como texto.

Si quieres profundizar más y ser más estricto puedes utilizar funciones o procedimientos almacenados dentro de la base de datos.

Las funciones y procedimientos almacenados (Store Procedure) son fragmentos de código (script) dentro de la base de datos (Mysql, MS SQL, Postgret, etc ) que limitan y restringen el acceso desde la aplicación y más aún desde FrontEnd.

Pero si estas comenzando y tu eres quien lleva el proyecto, estas muy bien con las sentencias preparadas. Cuando tu proyecto requiera más colaboradores, deberás empezar a incluir Stored Procedures y Funciones, para limitar a tus colaboradores a tener acceso a la Base de Datos y proteger tus datos ya no de los usuarios externos fuera de la web, sino de quienes trabajan contigo.

Dios te bendiga


Espero haber respondido
 
Igualmente para mayor seguridad también puedes utilizar un algoritmo de encriptación de los parámetros que pasas por la URL te dejo un código que te puede ayudar mucho mas fácil en ese aspecto.

Clase para encriptar y desencriptar:

PHP:
<?php
/**
* Description of Encrypter
*
*/
class Encrypter {
 
    private static $Key = "daycry";
 
    public static function encrypt ($input) {
        $output = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5(Encrypter::$Key), $input, MCRYPT_MODE_CBC, md5(md5(Encrypter::$Key))));
        return $output;
    }
 
    public static function decrypt ($input) {
        $output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5(Encrypter::$Key), base64_decode($input), MCRYPT_MODE_CBC, md5(md5(Encrypter::$Key))), "\0");
        return $output;
    }
 
}

Y para verificar si esta funcionando.

PHP:
$texto = "Texto a encriptar";
 
// Encriptamos el texto
$texto_encriptado = Encrypter::encrypt($texto);
 
// Desencriptamos el texto
$texto_original = Encrypter::decrypt($texto_encriptado);
 
if ($texto == $texto_original) echo 'Encriptación / Desencriptación realizada correctamente.';

Estas funciones solo reciben el String que usted desea encriptar y desencriptar

Espero haber sido útil cualquier cosa estamos a la orden.
 
Atrás
Arriba