DANH MỤC: NODE.JS & MYSQL

Bài 3: Escaping trong module MySQL


Ở bài trước mình đã giới thiệu với mọi người cách thực hiện truy vấn MySQL bằng Node.js rồi, bài này mình sẽ giới thiệu với mọi người một số kĩ thuật phòng chống lỗi SQL injection mà trong module này đã hỗ trợ chúng ta.

1, Kỹ thuật escaping.

Ở bài trước mình có giới thiệu với mọi người sử dụng phương thức query để thực thi câu truy vấn.

VD1: Thực thi câu truy vấn đơn lấy ra dữ liệu của 1 bản ghi. Trong đóid là do người dùng nhập vào.

var mysql = require('mysql');

var conn = mysql.createConnection({
    host    : 'localhost',
    user    : 'root',
    password: '',
    database: 'mysql_node',
});
//kết nối.
conn.connect(function (err){
    if (err) throw err.stack;

    var id = '4';
    var sql = "SELECT * FROM city where id = " + id;
    conn.query(sql, function (err,results, fields) {

        if (err) throw err;
        console.log(results);

    });
});

Ví dụ trên vẫn chạy bình thường. Nhưng ở đây chẳng hạn như người dùng không nhập id là các con số bình thường nữa mà họ thay đổi thành id = '4 or 1' thì lúc này câu truy vấn của chúng ta sẽ trở thành:

SELECT * FROM city where id = 4 OR 1

 Câu truy vấn trên luôn đúng và trả về kết quả là tất cả dữ liệu của bảng đó. Và từ đó người dùng có thể chèn thêm câu truy vấn khác vào được, lúc này sẽ rất nguy hiểm...

-Và để khắc phục vấn đề đó thì trong module mysql đã cung cấp cho chúng ta phương thức escape làm việc loại bỏ tất cả các yếu tố kiến câu truy cấn bị sai.

Cú Pháp:

conn.escape(value);

Trong đó:

  • conn - là object mysql đã chứa thông tin kết nối database.
  • value - là biến mà chúng ta muốn escaping.

VD2: Cũng với đề bài ở ví dụ 1 nhưng lần này chúng ta sẽ sử dụng kỹ thuật escaping.

var mysql = require('mysql');

var conn = mysql.createConnection({
    host    : 'localhost',
    user    : 'root',
    password: '',
    database: 'mysql_node',
});
//kết nối.
conn.connect(function (err){
    if (err) throw err.stack;

    var id = '4';
    var sql = "SELECT * FROM city where id = " + conn.escape(id);
    conn.query(sql, function (err,results, fields) {

        if (err) throw err;
        console.log(results);

    });
});

Lúc này nếu như người dùng có nhập vào id = '4 or 1' thì escaping sẽ có nhiệm vụ làm sạch câu truy vấn trên về dạng đúng là:

SELECT * FROM city where id = 4

2, Prepare data SQL trong module mysql.

-Ngoài cách sử dụng escaping để hạn chế lỗi mysql injection thì module mysql cũng hỗ trợ chúng ta prepare data vào câu truy vấn SQL để hạn chế lỗi ví dụ:

VD3:

conn.connect(function (err){
    if (err) throw err.stack;
    var id = '4';
    var sql = "SELECT * FROM city where id = ?";
    conn.query(sql,['3',], function (err,results, fields) {
        if (err) throw err;
        console.log(results);
    });
});

Chú thích: Mỗi dấu ? ở trong câu truy vấn sẽ đại diện cho một biến để chúng ta bind vào trong câu truy vấn tha số thứ 2 trong câu truy vấn lúc này sẽ là 1 mảng chứa dữ liệu mà chúng ta muốn bind vào trong câu truy vấn. Sử dụng cách này chúng ta cũng có thể hạn chế được lỗi mysql injection.

VD4: Prepare data.

var mysql = require('mysql');

var conn = mysql.createConnection({
    host    : 'localhost',
    user    : 'root',
    password: '',
    database: 'mysql_node',
});
//kết nối.
conn.connect(function (err){
    if (err) throw err.stack;
    var id = '4';
    var sql = "SELECT * FROM city WHERE id = ? AND zipcode = ?";
    conn.query(sql,['3','50000'], function (err,results, fields) {
        if (err) throw err;
        console.log(results);
    });
});

3, Lời kết.

-Ngoài những cách trên có thể giúp chúng ta hạn chế lỗi mysql injection, thì trong module mysql còn hỗ trợ chúng ta nhiều cách khác có thể hạn chế lỗi mysql injection nữa. Nếu các bạn cần có thể tham khảo thêm tại link.

Nguồn: Toidicode.com

Thông tin tác giả

Vũ Thanh Tài

Vũ Thanh Tài

The best way to learn is to share

Hãy tham gia group facebook để cùng giao lưu chia sẻ kiến thức! Tham Gia