2010-04-12 17 views
6

Estoy en proceso de crear un sitio con CodeIgniter. Este es el primer sitio que he creado y que interactúa con una base de datos. Estoy usando MySQL para este proyecto. ¿Cómo puedo saber si se deben escapar los datos antes de guardarlos en la base de datos?Cómo saber cuándo es necesario el escape para MySQL

Respuesta

3

Si está utilizando el database class con query bindings, usted no tiene que hacer ningún escape Manual:

El beneficio secundario de utilizar une es que los valores son automáticamente escaparon, produciendo consultas más seguras . Usted no tiene que recordar manualmente datos de escape; el motor lo hace automáticamente para usted.

+0

Al infractor, por favor, elabore;) Diablos, es la única respuesta relevante para CodeIgniter. –

+0

He votado negativamente debido a la segunda parte tonta. es irrelevante cuestionar y tener una idea terrible en sí misma. si necesita filtrar datos debido a que la lógica de negocios lo espera, haga esto, pero no para intentar asegurar algo. – zerkms

+0

+1 correcto y proporciona referencias. Incluso hace uso del hecho de que el Asker de la pregunta está usando codeigniter –

1

En caso de duda, escápate de todo. No puede ser muy seguro.

Muy bien, bien. Lo entiendo

siempre se evacua

+0

nunca confíes en el usuario. – Josiah

+2

esa es la respuesta incorrecta. Tu, @Josiah también. No hay nada de usuario o dudas relevantes. No hay nada relevante en absoluto. Escapar es un procedimiento incondicional. –

+0

+1 a Col. Shrapnel. Escaparse no es realmente un problema de seguridad, el escaparse es la forma de hacer que la consulta sea válida. – zerkms

4

No se preocupe por escapar de ti mismo (Va a meter la pata). Use una capa de BD donde prepare la declaración primero y luego agregue datos a ella.

En PHP debe usar PDO. Usted escribe

SELECT * FROM table WHERE key = :key AND value = :value 

y luego agrega los datos llamando a las funciones.

-2

¿Cuándo escapar? Tan pronto como su sitio se haga público.

+2

terrible error equivocado. Respuesta correcta: tan pronto como empiece a trabajar con la base de datos –

+0

@Col: escriba su propia respuesta, por favor, para que podamos +1 como mejor ;-) (no es ironía) – zerkms

2

Si los datos son una cadena, debe siempre escaparse.

Sin embargo, es mejor usar parámetros en su lugar.

-1

Escapas una cadena de consulta MySQL cuando cualquiera de la cadena se compone de entrada del usuario, por ejemplo:

en PHP: $ nombre de usuario =; // valor a partir de la entrada del usuario

entonces su cadena de consulta es: "INSERT INTO table ('nombre de usuario') VALUES (" $ nombre de usuario.. ")"

Usted tendría que salir de esta consulta mySQL debido al hecho de la variable de nombre de usuario $ podría potentionally tener el código malicous insertado por el cliente para ser inyectado en su base de datos.

+0

No es una cadena de consulta sino cadena de datos. No cuando la cadena está compuesta por la entrada del usuario, sino simplemente ** cualquier cadena **. Vaya a la figura –

8

Te aconsejo que te acostumbres a utilizar declaraciones preparadas. Especialmente dado que eres nuevo en el trabajo con bases de datos. Cuanto antes empiece a usar estos, más fácil se convertirá en una segunda naturaleza.

Yo, por ejemplo, no sabía sobre declaraciones preparadas cuando comencé con bases de datos. Y experimenté mi propia obstinación cuando entré en contacto con ellos. Porque ya me había acostumbrado a otra forma de hacer las cosas. Ahora bien, este podría no ser un personaje de ti mismo, pero no hace daño comenzar tan pronto como sea posible con eso.

Las declaraciones preparadas le permiten utilizar marcadores de posición en las consultas. Estos marcadores de posición se pueden sustituir con valores reales vinculándolos a los marcadores de posición. Este proceso de enlace escapa automáticamente de los valores.

Aquí hay un ejemplo (simple) PDO:

$db = new PDO(/* some database parameters */); 
$statement = $db->prepare('INSERT INTO table VALUES(:username, :password)'); 
$statement->bindValue(':username', $dirtyUsername); 
$statement->bindValue(':password', $dirtyPassword); 
$result = $statement->execute(); 
// result checking ommited for brevity 

Hay más posibilidades de Lot con DOP y declaraciones preparadas. Por ejemplo se puede reutilizar fácilmente la declaración preparada en un bucle, tales como:

$statement = $db->prepare('INSERT INTO table VALUES(:username, :password)'); 
foreach($users as $dirtyUser) 
{ 
    $statement->bindValue(':username', $dirtyUser->username); 
    $statement->bindValue(':password', $dirtyUser->password); 
    $result = $statement->execute(); 
    // result checking ommited for brevity 
} 

o pasar los enlaces marcador de posición para el método de ejecución, así:

$statement = $db->prepare('INSERT INTO table VALUES(:username, :password)'); 
$result = $statement->execute(array( 
            ':username' => $dirtyUsername, 
            ':password' => $dirtyPassword 
          )); 
// result checking ommited for brevity 

... etc, etc.

+0

El proceso de enlace no escapa. El resto está bien –

+0

En el caso de usar PDO, en realidad podría (ok, no la llamada a bindParam() exactamente). Cuando se establece el indicador ATTR \ _EMULATE \ _PREPARES (o se lo fuerza porque el controlador no admite instrucciones preparadas del lado del servidor), PDO crea una cadena de consulta que contiene los parámetros (escapados). – VolkerK

1

Si está generando SQL usted mismo en lugar de usar algo como PDO, entonces debe siempre cadenas de escape.

Escapar cadenas es un requisito básico del lenguaje SQL. Es lo que le permite usar caracteres como apóstrofes o barras invertidas en una cadena sin que todo salga mal. No hay ninguna situación en la que no se requiera escapar cadenas.

Incluso las cadenas se deben filtrar para asegurarse de que, de hecho, no sean cadenas.

Si está aprendiendo, considere seriamente aprender algo como PDO como muchos otros han dicho, en lugar de escapar de sus propias cadenas.

Cuestiones relacionadas