Mysql
 sql >> Baza danych >  >> RDS >> Mysql

budowanie dynamicznego zapytania w mysql i golang

Aby odpowiedzieć na pytanie, jak sformatować ciąg, prostą odpowiedzią jest użycie fmt.Sprintf aby ustrukturyzować swój ciąg. Jednak patrz dalej, aby uzyskać krótką notatkę na temat używania fmt.Sprintf do zapytań db:

Przykład:

query := fmt.Sprintf("SELECT id FROM users WHERE login='%s'", login)
err = db.Query(query)

// Equivalent to:
rows, err := db.Query("SELECT id FROM users WHERE login=?", login)

Używając tego do zapytań, jesteś bezpieczny przed zastrzykami. Biorąc to pod uwagę, możesz ulec pokusie, aby to zmodyfikować i użyć db.Exec również do tworzenia/aktualizacji/usuwania. Ogólna zasada:jeśli używasz db.Exec z fmt.Sprintf i nie oczyszczasz najpierw swoich danych wejściowych, otwierasz się na wstrzyknięcia sql .

GoPlay z prostym przykładem, dlaczego fmt.Sprintf z db.Exec jest złe:
https://play.golang.org/p/-IWyymAg_Q

Powinieneś użyć db.Query lub db.Prepare w odpowiedni sposób, aby uniknąć tego rodzaju wektorów ataku. Być może będziesz musiał zmodyfikować powyższy przykładowy kod, aby uzyskać fragment bezpieczny dla wstrzyknięć, ale mam nadzieję, że dałem wystarczająco dużo, aby zacząć.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Załaduj xml do tabeli mysql z elementem

  2. Usuń zduplikowane rekordy bez tworzenia tabeli tymczasowej

  3. Od sygnatury czasowej w SQL, wybierając rekordy z dzisiaj, wczoraj, w tym tygodniu, w tym miesiącu i pomiędzy dwiema datami php mysql

  4. MySQL:Ustaw domyślną wartość podczas aktualizacji

  5. Jak używać aliasów w operatorach matematycznych w SQL?