Cada vez que crea una cadena SQL concatenando cadenas, existe la posibilidad de un ataque de inyección, sin importar cuán seguro piense que es el acceso a esas cadenas. Por lo que usted sabe, alguien podría ejecutar su aplicación dentro de un depurador, poner un punto de interrupción en el resultado de QuotedStr()
y modificar su contenido antes de permitir que Format()
lo vea.
El uso de parámetros SQL reales es la forma más segura de hacerlo. No solo evita las inyecciones, sino que también permite que el motor de SQL decida la mejor forma de formatear los parámetros según sus propias necesidades, de modo que no tenga que preocuparse por formatear los valores en su propio código, sino que funciona bien con tipos de letra fuerte. idiomas (como Delphi). Sin mencionar los beneficios de rendimiento de poder preparar la declaración de SQL en el lado del servidor antes de ejecutarla en el código, incluso varias veces, reduciendo drásticamente el tráfico entre el cliente y el servidor y aumentando el rendimiento general.
var
sCustomer : string
begin
AdoSql.CommandText := 'Select SUM(value) result from invoices where customer=:Customer';
AdoSql.Prepared := True;
...
AdoSql.Parameters['Customer'].Value := sCustomer;
AdoSql1.ExecSQL;
...
AdoSql.Parameters['Customer'].Value := sCustomer;
AdoSql1.ExecSQL;
...
AdoSql.Prepared := False;
end;
Creo que el título debería haber sido 'Función QuotedStr vs Parámetros en los escenarios de inyección de sql?', Pero al cambiarlo, se desglosan algunas respuestas aquí. el * problema * aquí es sobre 'QuotedStr' y no' Format'. – kobik