sql >> Base de Datos >  >> RDS >> Oracle

¿Oci_bind_by_name evita la inyección de SQL de forma segura?

El uso de parámetros enlazados es suficiente en casos comunes y una buena práctica para evitar la inyección de SQL.

Pero un parámetro en una declaración preparada solo se puede usar para un valor en una expresión SQL. En otras palabras, donde normalmente escribiría un literal de cadena entrecomillado, un literal de fecha entrecomillado o un literal numérico. Y un parámetro ==un valor (sin listas).

Debe utilizar parámetros vinculados para esos casos. Si está haciendo esta pregunta porque cree que puede omitir el uso de parámetros vinculados si alguien responde que no son suficientes, lo siento, no se le excusará de las prácticas de programación segura.

Sin embargo, hay otros casos (quizás menos comunes) en los que los parámetros enlazados no funcionan. Si necesita escribir una consulta con un nombre de tabla dinámico, un nombre de columna u otro identificador, una expresión completa o una palabra clave de SQL, entonces necesita otro método. Estos casos deben corregirse en la sintaxis SQL en preparar tiempo, por lo que no se pueden parametrizar.

Por ejemplo, aquí hay una consulta con partes dinámicas indicadas por el uso de variables, que no pueden ser parámetros:

$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc";

Debe utilizar la lista blanca para esos casos . En otras palabras, asegúrese de que una cadena que interpole en su consulta como un nombre de tabla dinámica sea en realidad una de las tablas que existen en su base de datos. Asegúrese de que las palabras clave de SQL sean palabras clave legítimas.

Nunca tome la entrada del usuario palabra por palabra e interpólela en SQL (o cualquier otro código que se analice en tiempo de ejecución, como el argumento que alimenta a eval() o shellexec() ). Y no es solo la entrada del usuario lo que puede ser contenido no seguro.

Consulte también mi presentación Mitos y falacias de la inyección SQL para obtener más explicaciones.