2010-01-07 17 views
7

Sé que puedo usar los parámetros, pero ¿cuál es la forma correcta de evitar secuencias de cadenas? La consulta podría ser así:Escapar valores en consultas SQL (C# con conector SQL)

"INSERT INTO records (ReferenceID,Name,Note,Author) VALUES ('" + ID+ "','" + addlevel.textBox1.Text + "','"+addlevel.textBox2_note.Text+ "','"+Program.Username+"')"; 

sólo soy curioso, sólo quieren saber :)

EDIT: Pero ¿qué pasa con eso? "CREATE TABLE '+ cadena' .... parámetros no se pueden utilizar aquí

+0

Al definir un identificador (por ejemplo, un nombre de tabla), no se puede escapar. Puedes poner marcadores en el identificador para permitir algunos caracteres más (por ejemplo, espacios), pero solo tienes que asegurarte de que la cadena no contenga nada dañino. – Guffa

Respuesta

15

Si necesita realizar operaciones de base de datos, como crear tablas, entonces debe usar SQL Server Management Objects en lugar de ejecutar cadenas de SQL.

Para los parámetros de las operaciones CRUD es absolutamente la única ruta verdadera.

ACTUALIZACIÓN: Parece que la biblioteca del cliente MySQL contiene un método auxiliar para esta tarea desacertada. Puede llamar a MySqlHelper.EscapeString (cadena).

+0

Err..gracias, pero estoy usando MySQL. De cualquier manera en ese caso? – Snake

+0

Lo siento, no noté la etiqueta. No sé de una biblioteca similar para MySQL. –

+0

Ok, gracias! Además, probablemente no pueda hacerlo mejor. – Snake

12

La forma correcta es utilizar parámetros

!. 'Just Say No' para tratar de hacer el escape de sí mismo - es Demasiado fácil equivocarse. ¿Por qué crees que quieres para escapar de ellos manualmente en lugar de usar los parámetros?

+0

Absolutamente correcto: los parámetros ganan en cada conteo. –

+1

Lo sé, soy muy curioso. Por cierto, he editado la pregunta. ¿Qué pasa si el usuario ingresa el nombre de la tabla? Entonces tampoco puedo usar parámetros. – Snake

+1

No le conviene dejar que los usuarios definan la tabla en la que están insertando, lo que daría lugar a un agujero de seguridad muy grande. – Paolo

6

Si realmente, realmente, realmente necesitas escapar (de que no hay señal en su ejemplo):

string EncodeMySqlString(string value) { 
    return value.Replace(@"\", @"\\").Replace("'", @"\'") 
} 
+0

No, no para SQL. – erikkallen

+0

@erikkallen: No, no es para MS SQL Server. Por favor, compruebe de qué se trata la pregunta antes de votar ... – Guffa

+0

OK, lo siento. Desafortunadamente, no se puede eliminar downvote. – erikkallen

1

creo que lo único que tiene que hacer es value = value.Replace("'", "''")

Por supuesto que no debe hacer esto, pero ustedes saben que.

Editar: Aparentemente todo esto está mal para MySQL. Sin embargo, debería funcionar para PostgreSQL, MS SQL y Oracle.

+1

Observe que esto es para MySQL, no para MS SQL Server. El método que sugirió ABSOLUTAMENTE NO es suficiente para escaparse de cadenas para MySQL. – Guffa

0

use los parámetros de commnd en su lugar. Se ocupa de escapar de sí mismo. Es la solución también contra las inyecciones de sql.