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

Knex.js có ngăn chặn tiêm sql không?

Đọc kỹ từ tài liệu về phương pháp truyền dữ liệu về phương pháp chuyển các giá trị sang nguyên hàm ( http://knexjs.org/#Raw ).

Nếu bạn đang chuyển các giá trị dưới dạng tham số liên kết với raw như:

knex.raw('select * from foo where id = ?', [1])

Trong trường hợp đó, các tham số và chuỗi truy vấn được chuyển riêng đến trình điều khiển cơ sở dữ liệu bảo vệ truy vấn khỏi việc đưa vào SQL.

Các phương pháp trình tạo truy vấn khác luôn sử dụng định dạng liên kết nội bộ để chúng cũng an toàn.

Để xem cách một truy vấn nhất định được chuyển đến trình điều khiển cơ sở dữ liệu, người ta có thể làm như thế nào:

knex('foo').where('id', 1).toSQL().toNative()

Điều này sẽ xuất ra chuỗi SQL và các liên kết được cấp cho trình điều khiển để chạy truy vấn ( https://runkit.com/ nhúng / 2yhqebv6pte6 ).

Sai lầm lớn nhất mà người ta có thể làm với các truy vấn thô là sử dụng chuỗi mẫu javascript và nội suy các biến trực tiếp thành định dạng chuỗi SQL như:

knex.raw(`select * from foo where id = ${id}`) // NEVER DO THIS 

Một điều cần lưu ý là tên mã định danh / bảng quỳ không thể được chuyển dưới dạng ràng buộc với trình điều khiển, vì vậy với những tên đó cần hết sức cẩn thận để không đọc tên bảng / cột từ người dùng và sử dụng chúng mà không xác thực chúng trước.

Chỉnh sửa:

Bằng cách nói rằng tên mã định danh không thể được chuyển dưới dạng liên kết, ý tôi là khi một người đang sử dụng ?? quỳ -binding cho tên mã định danh, sẽ được hiển thị như một phần của chuỗi SQL khi được chuyển đến trình điều khiển cơ sở dữ liệu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Docker MySQL - không thể kết nối từ ứng dụng Spring Boot với cơ sở dữ liệu MySQL

  2. Nhận chuỗi truy vấn MySQL đầy đủ khi chèn hoặc cập nhật

  3. Kết quả Hộp văn bản tự động hoàn thành dựa trên cơ sở dữ liệu SQL

  4. PHP MySQL mysql_fetch_assoc với các khóa mảng được phân biệt bằng ký hiệu 'as'

  5. Cách đặt múi giờ MySQL JDBC chính xác trong cấu hình Spring Boot