devcode-it / openstamanager

Il software gestionale open source per l'assistenza tecnica e la fatturazione
https://www.openstamanager.com
GNU General Public License v3.0
108 stars 68 forks source link

Ricerca con ajax_dataload.php causa errori SQL #269

Closed AlexDicy closed 5 years ago

AlexDicy commented 6 years ago

Quando viene utilizzata la funzione search del DataTable per le Anagrafiche, la ricerca tramite Ragione sociale causa dei problemi, ovvero, la query SQL non è valida perché nella parte ORDER BY Ragione sociale mancano le virgolette, può essere risolto molto facilmente utilizzando la funzione prepare in questo modo https://github.com/devcode-it/openstamanager/blob/6c0cd2a8cf788917c445d85491a1e263aeb81877/ajax_dataload.php#L76 Dovrebbe essere rimpiazzato con

$module_query = implode('ORDER', $pieces).' ORDER BY '.prepare($total['order_by'][$order['column']]).' '.$order['dir'];

(notare il prepare prepare($total['order_by'][$order['column']]))

Dasc3er commented 6 years ago

@HAlex In realtà la problematica è leggermente più complessa da affrontare, e stiamo considerando le possibili migliorie da applicare alla gestione di queste query... Di fatto applicare questa modifica bloccherebbe tutte le tabelle che utilizzano una query per il campo di ricerca.

AlexDicy commented 6 years ago

Capisco, potresti spiegarmi meglio l'ultima frase? Non ho riscontrato questa problematica

Dasc3er commented 6 years ago

Un semplice esempio può essere il codice degli Interventi: per permettere il corretto ordinamento, la query necessaria è CAST(in_interventi.codice AS UNSIGNED), che diventerebbe `CAST(in_interventi.codice AS UNSIGNED)` provocando un errore. Di fatto, abbiamo riscontrato il problema inverso nei campi per la personalizzazione della ricerca (_searchinside), dove la presenza degli apici automatici può provocare malfunzionamenti in determinate condizioni.

L'utilizzo del metodo prepare() dovrebbe essere limitato all'aggiunta dei valori di input all'interno delle query, che comunque dovrebbe essere evitato in favore di altri sistemi più sicuri (Prepared Statements #160, ORM #102).

AlexDicy commented 6 years ago

Grazie per l'informazione, non avevo notato l'ordinamento degli impianti avendolo modificato

Dasc3er commented 6 years ago

@HAlex Con il commit d255b538e353c5c4ac6f94544c384bbc3493c513 il problema dovrebbe essere stato risolto. Ora anche i campi _searchinside devono essere gestiti completamente dal programmatore (come _orderby).

@devcode-it/openstamanager Ho inoltre automatizzato l'aggiunta dei permessi per le nuove Viste.

Spillo89 commented 6 years ago

fare un prepare sull'alias non porta purtrippo a nulla. attualmente questa problematica l'ho risolta così:

$as = $total['order_by'][$order['column']];
$record = $dbo->fetchArray("SELECT query FROM zz_views WHERE name='$as'");

$module_query = implode('ORDER', $pieces).' ORDER BY '.$record[0]['query'].' '.$order['dir'];

Sono andato a recuperare l'effettivo nome della colonna tramite l'alias e sono andato a inserirlo al posto del suddetto. Attualmente a me funziona anche per altre viste e per altri campi come Città, che andando a prendere l'alias con la 'à' dava comunque errore