Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Golang ORDER BY có vấn đề với MySql

Phần giữ chỗ ( '?' ) chỉ có thể được sử dụng để chèn giá trị động, giá trị thoát cho các tham số bộ lọc (ví dụ:trong WHERE part), nơi các giá trị dữ liệu sẽ xuất hiện, không phải cho từ khóa SQL, số nhận dạng, v.v. Bạn không thể sử dụng nó để chỉ định động ORDER BY HOẶC NHÓM THEO giá trị.

Tuy nhiên, bạn vẫn có thể làm điều đó, ví dụ:bạn có thể sử dụng fmt.Sprintf () để tập hợp văn bản truy vấn động như sau:

ordCol := "title"

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

Những điều cần ghi nhớ:

Làm như vậy bạn sẽ phải bảo vệ thủ công so với SQL injection, ví dụ:nếu giá trị của tên cột đến từ người dùng, bạn không thể chấp nhận bất kỳ giá trị nào và chỉ cần chèn nó trực tiếp vào truy vấn, người dùng sẽ có thể làm tất cả các loại điều xấu. Thông thường, bạn chỉ nên chấp nhận các chữ cái trong bảng chữ cái tiếng Anh + chữ số + dấu gạch dưới ( '_' ).

Không cần cố gắng cung cấp chức năng kiểm tra hoặc thoát hoàn chỉnh, toàn diện, bạn có thể sử dụng regexp đơn giản này chỉ chấp nhận các chữ cái tiếng Anh, chữ số và '_' :

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

Ví dụ (thử trên 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. Di chuyển db Laravel - lỗi đổi tênColumn - Đã yêu cầu loại cơ sở dữ liệu không xác định

  2. Sự khác biệt giữa NOW (), SYSDATE () &CURRENT_DATE () trong MySQL

  3. Giới thiệu về các kiểu dữ liệu SQL

  4. Đang điền danh sách thả xuống - PHP Ajax MySQL

  5. Nhiều COUNT () cho nhiều điều kiện trong một truy vấn (MySQL)