Mysql
 sql >> база данни >  >> RDS >> Mysql

Golang ПОРЪЧАЙТЕ ПО проблем с MySql

Заместители ('?' ) може да се използва само за вмъкване на динамични, екранирани стойности за параметрите на филтъра (напр. в WHERE част), където трябва да се показват стойностите на данните, а не за SQL ключови думи, идентификатори и т.н. Не можете да го използвате за динамично определяне на ORDER BY ИЛИ ГРУПИРАНЕ ПО стойности.

Все пак можете да го направите, например можете да използвате fmt.Sprintf() за да съберете текста на динамичната заявка по следния начин:

ordCol := "title"

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

Неща, които трябва да имате предвид:

По този начин ще трябва ръчно да защитавате срещу SQL инжекция, напр. ако стойността на името на колоната идва от потребителя, не можете да приемете никаква стойност и просто да я вмъкнете директно в заявката, в противен случай потребителят ще може да прави всякакви лоши неща. Тривиално трябва да приемате само букви от английската азбука + цифри + долно черти ('_' ).

Без да се опитвате да предоставите пълна, цялостна функция за проверка или екраниране, можете да използвате този прост регулярен израз, който приема само английски букви, цифри и '_' :

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

Примери (опитайте го на 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL изход в дървовиден формат ИЛИ Добавяне на ниво (Родител-Дете)

  2. Импортирайте MySQL база данни в MS SQL Server

  3. Защо easy_install не може да намери MySQLdb?

  4. Загуба на връзка с MySQL след известно време и не се свързва отново

  5. Динамичен падащ списък за различни държави, щати, географски местоположения?