Mysql
 sql >> Database >  >> RDS >> Mysql

Golang ORDINA PER problema con MySql

Segnaposto ('?' ) può essere utilizzato solo per inserire valori dinamici con escape per i parametri del filtro (ad es. nel WHERE parte), dove dovrebbero apparire i valori dei dati, non per le parole chiave SQL, gli identificatori, ecc. Non puoi usarlo per specificare dinamicamente il ORDER BY OPPURE GROUP BY valori.

Puoi comunque farlo, ad esempio puoi usare fmt.Sprintf() per assemblare il testo dinamico della query in questo modo:

ordCol := "title"

qtext := fmt.Sprintf("SELECT * FROM Apps ORDER BY %s DESC", ordCol)
rows, err := db.Query(qtext)

Cose da tenere a mente:

In questo modo dovrai difendere manualmente l'iniezione di SQL, ad es. se il valore del nome della colonna proviene dall'utente, non puoi accettare alcun valore e inserirlo direttamente nella query, altrimenti l'utente sarà in grado di fare tutti i tipi di cose cattive. Banalmente dovresti accettare solo lettere dell'alfabeto inglese + cifre + trattino basso ('_' ).

Senza tentare di fornire un controllo completo e completo o una funzione di escape, puoi utilizzare questa semplice espressione regolare che accetta solo lettere inglesi, cifre e '_' :

valid := regexp.MustCompile("^[A-Za-z0-9_]+$")
if !valid.MatchString(ordCol) {
    // invalid column name, do not proceed in order to prevent SQL injection
}

Esempi (provalo su Go Playground ):

fmt.Println(valid.MatchString("title"))         // true
fmt.Println(valid.MatchString("another_col_2")) // true
fmt.Println(valid.MatchString("it's a trap!"))  // false
fmt.Println(valid.MatchString("(trap)"))        // false
fmt.Println(valid.MatchString("also*trap"))     // false