2011-06-01 21 views
5

Actualmente uso MySql, pero preferiría una solución ODBC para que sea a prueba en el futuro.Cómo desinfectar la entrada de la base de datos ODBC?

¿Cómo saneo la entrada del usuario antes de pasarlo a una base de datos ODBC?

Y, mientras estoy en ello, envuelvo mi cadena entre comillas dobles, p. Ej. "INSERT INTO VALORES (descripción) '' '-, pero lo que si el texto en sí contiene comillas dobles

+1

¿A qué tipo de entrada de usuario se refiere? Por ejemplo, si el usuario le da consultas para ejecutar, tiene mucho trabajo por delante. Además de escapar de los caracteres especiales, como ya ha mencionado, también deberá prestar atención a los problemas de seguridad, como la inyección SQL, y probablemente también quiera limitar el conjunto de declaraciones aceptables (por ejemplo, no lo haga). permitir DDL.) Por otro lado, si el usuario simplemente le da datos y su aplicación utiliza ODBC para escribir los datos en la base de datos, entonces no tiene que hacer nada porque los datos y sus instrucciones SQL no se mezclan. –

+1

posible duplicado de [Delphi - previene contra la inyección de SQL] (http://stackoverflow.com/questions/6000648/delphi-prevent-against-sql-injection) – Johan

+0

ODBC ** no ** lo hará a prueba en el futuro, lo hará hacerlo lento, despojarlo de opciones y hacerlo con errores. Cualquier cantidad de alternativas servirá, ZEOS se puede conectar a aproximadamente 10 bases de datos, también lo puede hacer ADO. – Johan

Respuesta

8

Trate de usar una sentencia SQL parametrizada

como este.

INSERT INTO MyTable (Field1,Field2) VALUES (:Param1,:Param2) 

verificación de este artículo de embarcadero para obtener más información sobre cómo los parámetros uso Using Parameters in Queries.

+0

+1 Estoy tratando de seguir el ejemplo de http://docwiki.embarcadero.com/CodeExamples/en/ADOQuery_%28Delphi%29 pero recibo una excepción sobre '_latin1' Voy a publicar otra pregunta pidiendo ayuda sobre eso. – Mawg

3

Uso hibernate si se puede, tal vez a través de RMI de delphi Aunque es centrada en Java, se aísla casi por completo al programador de?. la base de datos subyacente, y se ocupa de las cuestiones que usted ha mencionado y mucho más.

por cierto, para responder a su pregunta re comillas dobles, para guardar un valor que contiene comillas dobles, escapar de ellos como comillas dobles se duplicó, por ejemplo

This is "my" text 

se guardarán como

"This is ""my"" text" 
+0

-1, primero ODBC, que hibernar, cuántos niveles de direccionamiento indirecto desea, solo use parámetros y código nativo. – Johan

8
  1. ODBC no es una forma óptima de trabajar con MySQL. Incluso si necesita admitir pocos DBMS en el futuro, entonces puede considerar las bibliotecas de acceso a datos con múltiples DBMS, incluidos dbExpress (viene con Delphi) y 3d party - AnyDAC (comercial), ZeosLib (freeware), etc.
  2. If necesita sustituir una constante de cadena en una consulta de MySQL, entonces necesita esacape the special characters o convertir la cadena en hexadecimal representation. Eso lo protege de posibles errores de inyección SQL y sintaxis. Pero hace que la preparación de su consulta sea más compleja.
  3. La mejor manera: use parámetros y envíe literales como valores de los parámetros. Eso es simple y seguro.
Cuestiones relacionadas