Entiendo que las declaraciones preparadas son la mejor manera de buscar protección contra la inyección de SQL. Sin embargo, brindan cobertura de manera limitada; por ejemplo, en los casos en que dejo que el usuario decida cómo será el orden por operación (es decir, ¿es ASC o DESC? etc.), no obtengo cobertura allí con las declaraciones preparadas.PHP: usando declaraciones preparadas y protegiendo contra la inyección de SQL frente a escape
Entiendo que puedo asignar la entrada del usuario a una lista blanca predefinida para eso. Pero esto solo es posible cuando se puede crear o adivinar una lista blanca de antemano.
Por ejemplo, en los casos que mencioné anteriormente (el ASC o DESC), esto se puede mapear y verificar fácilmente contra una lista de valores aceptados. Pero, ¿no hay una situación en la que la parte de la declaración SQL no puede verificarse contra una lista blanca?
Si tal situación existe, ¿cuál es el enfoque recomendado?
Si tuviera que escapar el user_input utilizando la utilidad de escape integrada de la base de datos subyacente (como mysqL_real_escape_string para mysql) en general, ¿dónde fallaría?
que estoy haciendo esta pregunta con la suposición de que siempre construyo mis sentencias SQL con valores citados - incluso para los números enteros ...
Vamos a echar un vistazo al siguiente ejemplo y reflexionar sobre ella ..
select {$fields} from {$table} where Age='{$age}' order by {$orderby_pref}
Supongamos que todos los vars son proporcionados por el usuario.
Si fuera a mysql_real_escape_string todas las variables en el SQL anterior (en lugar de usar declaraciones preparadas que me cubren solo a mitad de camino forzándome a subir a listas blancas para la otra mitad que no puede ayudar), ¿no sería así? ser igualmente seguro (y más fácil de codificar)? De lo contrario, ¿en qué escenario de entrada fallaría la utilidad de escape?
$fields = mysql_escape($fields);
$table = mysql_escape($table);
$age = mysql_escape($age);
$orderby_pref = mysql_escape($orderby_pref);
select {$fields} from {$table} where Age='{$age}' order by {$orderby_pref}
Subida vertida porque ya conoce y se preocupa por las inyecciones sql (en oposición a la mayoría de las personas que formulan preguntas aquí en la etiqueta PHP) – Mahn
Existe una diferencia entre el SQL dinámico y la adición de valores en las consultas. Ambos parámetros vinculados o la concatenación de cadenas (más el escape) podrían usarse para agregar valores. SQL dinámico requiere una lista blanca de sintaxis aceptable. Entonces, use una expresión regular, un mapa o una declaración de cambio para agregar 'DESC' o' ORDER' y otros calificadores. Sin embargo, los procedimientos almacenados serían una alternativa larga. – mario