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

Cách thoát các ký tự đặc biệt mysql bằng sockets.io/node.js/javascript

Đừng làm điều đó

Bạn đang hỏi về giải pháp sai cho vấn đề.

Để thay thế các dấu nháy đơn bằng dấu gạch chéo ngược, bạn có thể sử dụng:

str = msg.replace(/'/g, '\\\'');

nhưng bạn không nên làm điều đó . Tôi chỉ cung cấp thông tin đó vì đó là những gì câu hỏi của bạn đặt ra nhưng hãy đọc phần bên dưới.

Tại sao đó là một ý tưởng tồi

Bạn không nên làm điều đó ở phía máy khách và bạn cũng không nên làm ở phía máy chủ. Nếu việc tránh các lỗ hổng SQL injection là một vấn đề đơn giản của việc thay thế dấu nháy đơn bằng dấu nháy ngược-dấu nháy đơn thì đó sẽ không phải là vấn đề. Thật không may, nó phức tạp hơn.

Có thông tin mà bạn đã cung cấp, thậm chí không thể biết được liệu dấu gạch chéo ngược-dấu nháy đơn có thực hiện những gì bạn mong đợi ngay từ đầu mà không thấy mã của bạn thực sự tạo ra các truy vấn cơ sở dữ liệu hay không. Nhưng nó không quan trọng bởi vì bạn không bao giờ nên làm điều đó. Không bao giờ. Hãy xem những câu trả lời đó để biết lý do tại sao - những câu hỏi đó không phải về SQL injection mà là các ví dụ mã bao gồm các lỗ hổng SQL injection và câu trả lời giải thích điều đó:

Truyện tranh bắt buộc

Thay vào đó, bạn nên làm gì

Điều đó đã được nói, bạn không cho biết bạn đang sử dụng mô-đun nào để truy vấn cơ sở dữ liệu nhưng không có vấn đề gì nếu bạn đang sử dụng mysql mô-đun hoặc Sequelize hoặc bất cứ thứ gì đáng giá, luôn phải có cơ chế nội suy các biến theo cách an toàn mà không cần thoát và nối các chuỗi theo cách thủ công.

Ví dụ

Bạn đã không hiển thị dù chỉ một dòng mã có liên quan ở đây vì vậy tôi không thể cho bạn biết cách khắc phục nó nhưng hãy xem xét ví dụ sau:

Không an toàn:

connection.query(
  "SELECT * FROM player WHERE nick = '"
  + data.login + "' AND pass = '" + data.pass + "'",
  function (err, rows) {
    //...
  }
);

Vẫn không an toàn, phức tạp, không thể đọc được, không thể hiểu được và không đáng tin cậy:

connection.query(
  "SELECT * FROM player WHERE nick = '"
  + data.login.replace(/'/g, '\\\'') + "' AND pass = '" + data.pass.replace(/'/g, '\\\'') + "'",
  function (err, rows) {
    //...
  }
);

An toàn và đơn giản:

connection.query(
  "SELECT * FROM player WHERE nick = ? AND pass = ?", [data.login, data.pass],
  function (err, rows) {
    // ...
  }
);

Thông tin thêm

Để biết thêm thông tin, hãy xem tài 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. Làm cách nào để kết nối với cơ sở dữ liệu MySQL từ iPhone?

  2. Làm cách nào để xác định xem có sử dụng SSL trong Kết nối MySql không?

  3. Hibernate OnDelete Cascade không hoạt động cho MySql nhưng hoạt động trên postgres và Ms-Sql

  4. MySQL - Tìm MIN nhưng không phải 0

  5. CHÈN SỐ LƯỢNG LỚN trong MYSQL