Có thể ngăn chặn việc đưa SQL vào Node.js (tốt nhất là với một mô-đun) giống như cách mà PHP có các Câu lệnh chuẩn bị bảo vệ chống lại chúng không.
Nếu vậy, làm thế nào? Nếu không, một số ví dụ có thể bỏ qua mã tôi đã cung cấp là gì (xem bên dưới).
Một số bối cảnh:
Tôi đang tạo một ứng dụng web với ngăn xếp back-end bao gồm Node.js + MySql bằng cách sử dụng mô-đun node-mysql . Từ góc độ khả năng sử dụng, các mô-đun là rất tốt, nhưng nó vẫn chưa được thực hiện một cái gì đó giống như PHP chuẩn bị phát biểu (mặc dù tôi biết nó là trên todo ).
Theo hiểu biết của tôi, việc thực hiện các câu lệnh chuẩn bị của PHP, trong số những thứ khác, đã giúp rất nhiều trong việc ngăn chặn việc tiêm SQL. Tuy nhiên, tôi lo lắng rằng ứng dụng node.js của tôi có thể bị tấn công tương tự, ngay cả khi thoát chuỗi được cung cấp theo mặc định (như trong đoạn mã bên dưới).
node-mysql dường như là trình kết nối mysql phổ biến nhất cho node.js, vì vậy tôi đã tự hỏi những người khác có thể đang làm gì (nếu có) để giải thích cho vấn đề này - hoặc nếu nó là một vấn đề với node.js để bắt đầu (không chắc điều này sẽ như thế nào, vì đầu vào phía người dùng / máy khách có liên quan).
Tôi có nên chuyển sang node-mysql-native trong lúc này không, vì nó cung cấp các câu lệnh đã chuẩn bị sẵn? Tôi do dự khi làm điều này, bởi vì nó dường như không hoạt động như node-mysql (mặc dù điều đó có thể chỉ có nghĩa là nó đã hoàn thành).
Dưới đây là một đoạn mã đăng ký người dùng, sử dụng mô-đun sanitizer , cùng với cú pháp giống câu lệnh đã chuẩn bị sẵn của node-mysql (như tôi đã đề cập ở trên, không thoát ký tự), để ngăn chặn việc tạo tập lệnh trang web và chèn sql tương ứng:
// Prevent xss
var clean_user = sanitizer.sanitize(username);
// assume password is hashed already
var post = {Username: clean_user, Password: hash};
// This just uses connection.escape() underneath
var query = connection.query('INSERT INTO users SET ?', post,
function(err, results)
{
// Can a Sql injection happen here?
});