Mi compañero en un proyecto PHP objeta mi práctica de desinfectar siempre valores enteros en SQL dinámico. Usamos consultas parametrizadas cuando es posible. Pero para las condiciones UPDATE y DELETE, Zend_Db_Adapter
requiere una cadena SQL no parametrizada. Es por eso que, incluso sin pensar, siempre escribir algo como:¿Está bien permitir SQL a veces dinámico sin desinfección?
$db->delete('table_foo', 'id = ' . intval($obj->get_id()));
que es equivalente, pero es una versión más corta (He comprobado el código fuente ZF):
$db->delete('table_foo', $db->qouteInto('id = ?', $obj->get_id(), 'INTEGER'));
Mi pareja fuertemente objeta esto intval()
, diciendo que si el ID $obj
es nulo (el objeto aún no está guardado en la base de datos), no notaré un error, y la operación DB simplemente se ejecutará en silencio. Eso es lo que realmente le ha sucedido a él.
Dice que si desinfectamos todas las entradas de formularios HTML, no hay manera de que un ID entero pueda entrar en '; DROP TABLE ...'
, o ' OR 1 = 1
', u otro valor desagradable, y se inserte en nuestras consultas SQL. Por lo tanto, estoy paranoico y estoy haciendo nuestras vidas innecesariamente más complicadas. "Deja de confiar en los valores $_SESSION
", dice.
Sin embargo, para las condiciones de valores de cadena que está de acuerdo con:
$db->update->(
'table_foo',
$columns,
'string_column_bar = ' . $db->qoute($string_value))
);
no pude demostrar que estaba equivocado, y él no pudo probar que estoy equivocado. ¿Puedes hacer algo?
Declaraciones paramétricas! Declaraciones paramétricas! Declaraciones paramétricas! http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php – Cheekysoft
@Cheekysoft Señor, ¿ha leído la pregunta con cuidado? Usamos declaraciones parametrizadas. Envía tu mantra a Zend :) –
¡Guau! Parece que puedes enlazar en eliminar y actualizar: http://stackoverflow.com/questions/1845153/zend-framework-how-to-delete-a-table-row-where-multiple-things-are-true –