Quickie: reemplace todas las apariciones de '(apóstrofe) con' '(dos apóstrofes) en un AnsiString (C ++)

StackOverflow https://stackoverflow.com/questions/463816

  •  19-08-2019
  •  | 
  •  

Pregunta

Creo que puedes adivinar el problema que estoy teniendo. Estoy insertando nombres de archivo en una base de datos sql en C ++ Builder. Algunos archivos tienen un apóstrofe en su nombre. Esto rompe la consulta de inserción SQL. la forma habitual de solucionar esto es duplicar y apóstrofos que desea formar parte del valor del campo.

Por ejemplo, si quiero agregar 'george's' al campo 'propietario', la consulta sql sería 'insertar en los valores de la tabla (propietario) (' george '') ''

Estoy bien con ese bit. Solo necesito reemplazar los apóstrofes simples por los dobles. AnsiString no parece tener una función integrada para esto. ¿Hay una manera simple de hacerlo sin tener que incluir un archivo de encabezado completamente nuevo?

¿Fue útil?

Solución

En realidad recibí la respuesta por mí mismo ...

item = StringReplace( item, "'", "''", TReplaceFlags() <<rfReplaceAll );

(entonces hay una función de reemplazo incorporada en AnsiString después de todo)

Editar: etiquetas de código agregadas para que podamos distinguir entre diferentes comillas

Otros consejos

No he usado AnsiString, pero básicamente haría lo siguiente:

  • Búsqueda inversa de comillas simples en su cadena
  • Mire a la izquierda y a la derecha del índice actual de comillas simples
  • Si no hay una sola cita allí, inserte una sola cita después de su índice actual
  • Continúe haciendo bucles hasta llegar al índice 0.

La forma habitual de hacer esto es usar declaraciones preparadas en lugar de generar su propio sql. Busque SQL Injection por una razón por la cual esto es malo. Básicamente, si en algún lugar de su aplicación, olvida duplicar las comillas en cualquier instrucción sql, y un atacante puede de alguna manera enviar un valor a esa declaración sql, su base de datos está pirateada. (Consulte este cómic de xkcd para ver un ejemplo chistoso de lo que puede suceder).

En C ++ Builder, está buscando la función AnsiQuotedStr , en SysUtils . Su inverso es AnsiExtractQuotedStr . No son métodos del tipo AnsiString en sí porque no necesitan un conocimiento íntimo de las partes internas del tipo.

Sin embargo, lo más importante es que debería usar consultas parametrizadas . Si los componentes que está utilizando para acceder a la base de datos no son compatibles, obtenga una biblioteca de base de datos diferente. No hay escasez de opciones de base de datos, por lo que puede darse el lujo de ser exigente con las funciones, y las consultas parametrizadas deben estar cerca de la parte superior de la lista.

Tenga en cuenta que a pesar de sus nombres, las funciones AnsiX aceptan los parámetros UnicodeString , no AnsiString , en Delphi y C ++ Builder 2009.

¿Qué sucede si lo sustituyes así?

item = StringReplace( item, "'", "\'", TReplaceFlags() );
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top