Il mio partner su un progetto PHP si oppone alla mia pratica di disinfettare sempre i valori interi in SQL dinamico. Usiamo query parametriche quando possibile. Ma per le condizioni UPDATE e DELETE Zend_Db_Adapter
è necessaria una stringa SQL non parametrizzata. È per questo che, anche senza pensare, sempre scrivere qualcosa come:È OK consentire SQL a volte dinamico senza disinfezione?
$db->delete('table_foo', 'id = ' . intval($obj->get_id()));
che è equivalente, ma è una versione più breve di (ho controllato il codice sorgente ZF):
$db->delete('table_foo', $db->qouteInto('id = ?', $obj->get_id(), 'INTEGER'));
mio compagno obietta fortemente questo intval()
, dicendo che se l'ID $obj
è nullo (l'oggetto non è ancora stato salvato nel DB), non noterò un errore e l'operazione DB verrà eseguita silenziosamente. Questo è ciò che gli è realmente accaduto.
Dice che se disinfettiamo tutti i moduli HTML immessi, non è possibile che un ID intero possa entrare in '; DROP TABLE ...'
o ' OR 1 = 1
'o un altro valore sgradevole e venga inserito nelle nostre query SQL. Quindi, sono solo paranoico e sto rendendo le nostre vite inutilmente più complicate. "Smetti di fidarti dei valori $_SESSION
quindi" dice.
Tuttavia, per le condizioni di valore stringa di lui non è d'accordo con:
$db->update->(
'table_foo',
$columns,
'string_column_bar = ' . $db->qoute($string_value))
);
non sono riuscito a dimostrare che aveva torto, e non è riuscito a dimostrare che mi sbaglio. Puoi fare entrambi?
Dichiarazioni parametrate! Dichiarazioni parametrate! Dichiarazioni parametrate! http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php – Cheekysoft
@Cheekysoft Signore, avete letto attentamente la domanda? Usiamo dichiarazioni parametrizzate. Invia il tuo mantra a Zend :) –
Wow! Sembra che tu possa associare in delete e update: http://stackoverflow.com/questions/1845153/zend-framework-how-to-delete-a-table-row-where-multiple-things-are-true –