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
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.
En caso de duda, escápate de todo. No puede ser muy seguro.
Muy bien, bien. Lo entiendo
siempre se evacua
nunca confíes en el usuario. – Josiah
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. –
+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
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.
¿Cuándo escapar? Tan pronto como su sitio se haga público.
terrible error equivocado. Respuesta correcta: tan pronto como empiece a trabajar con la base de datos –
@Col: escriba su propia respuesta, por favor, para que podamos +1 como mejor ;-) (no es ironía) – zerkms
Si los datos son una cadena, debe siempre escaparse.
Sin embargo, es mejor usar parámetros en su lugar.
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.
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 –
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.
El proceso de enlace no escapa. El resto está bien –
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
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.
- 1. ¿Cuándo es necesario deshacerse?
- 2. No es necesario usar escape seq. para 'in C#?
- 3. Application.DoEvents, ¿cuándo es necesario y cuándo no?
- 4. ¿Cuándo es necesario el "var" en js?
- 5. ¿Cómo saber cuándo Big O es logarítmico?
- 6. Cuándo usar AtomicReference (Java)? ¿Es realmente necesario?
- 7. Escape cadena Python para MySQL
- 8. sun-jaxws.xml - ¿Cuándo es necesario y cuándo no?
- 9. ¿Cuándo es necesario el mapa no modificable (realmente)?
- 10. ¿Cómo saber cuándo termina el TTS?
- 11. ¿Es necesario colocar tablas temporales en mysql?
- 12. ¿Cómo se determina el hardware necesario para un servidor?
- 13. saber cuándo llamar persistir
- 14. ¿Cómo saber cuándo es el momento de usar un marco para desarrollar un sitio web?
- 15. ¿Cuándo es necesario ejecutar invalidate() en una vista?
- 16. ¿Cuál es la mejor estrategia de carácter de escape para el combo Python/MySQL?
- 17. ¿Cuándo es necesario "extern C" en C++ en Windows?
- 18. Java: Producer = Consumer, ¿cómo saber cuándo parar?
- 19. writeToFile cómo saber cuándo se completó
- 20. ¿Cuándo CDATA vs. Escape & Vice Versa?
- 21. ¿Cómo saber cuándo sale el proceso en Linux?
- 22. Cómo saber cuándo Windows está inactivo
- 23. ¿Cómo puedo saber si una columna es auto_increment en mysql?
- 24. ¿Cómo puedo saber cuándo NSTextView pierde foco?
- 25. wpf ¿cómo saber cuándo ha finalizado el enlace de datos?
- 26. System.Runtime.Caching.MemoryCache - es necesario el bloqueo
- 27. WCF: ¿Cómo saber cuándo termina una sesión?
- 28. ¿Cómo puedo saber cuándo ha llegado el último OutputDataReceived?
- 29. ¿Cómo saber cuándo se ha pausado el MPMoviePlayerController en iPhone?
- 30. ¿Cómo saber cuándo el dispositivo iOS está enchufado?
Al infractor, por favor, elabore;) Diablos, es la única respuesta relevante para CodeIgniter. –
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
+1 correcto y proporciona referencias. Incluso hace uso del hecho de que el Asker de la pregunta está usando codeigniter –