Hướng dẫn dùng sql escape trong PHP

Ở 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.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Bài Viết Mới

Các hàm trên thuộc về nhóm hàm, chúng ta dùng để bảo mật/ bảo vệ website. Một dữ liệu khi được thêm vào database có thể có 2 khả năng xấu như sau:

Đang xem: Mysql escape string trong php

– Một là: dữ liệu đó có chứa các kí tự đặc biệt (ví dụ như dấu ‘ , ” , /, …) làm cho câu query của chúng ta bị lỗi cú pháp.

Ví dụ:
$bien = ‘Cái gì” đây ta’;
mysql_query(“select * from news where title=’$bien’ “);

==> Rõ ràng trong $bien có chứa dấu “, nên khi đưa vào câu query sẽ làm cho câu query bị lỗi cú pháp.

Do đó trong trường hợp này, ta cần phải có hàm để xử lý các biến trước khi đưa vào câu query. Và ứng cử viên sáng giá hiện giờ là: addslashes, mysql_real_escape_string

+ Phân biệt addslashes, mysql_real_escape_string:
* Thông thường các hệ quản trị cơ sở dữ liệu (HQTCSDL) đều có hàm xử lý kí tự đặc biệt, nên php chỉ cần chuyển qua cho HQTCSDL

Đối với Mysql thì khi ta gọi hàm mysql_real_escape_string thì php sẽ chuyển xuống cho mysql xử lý (do đó trước khi dùng hàm này, phải gọi hàm mysql_connect)
Đối với PostgreSql thì khi ta gọi hàm pg_escape_string thì php sẽ chuyển xuống cho PostgreSql xử lý

* Đối với các HQTCSDL không có hàm xử lý các kí tự đặc biệt thì ta sẽ dùng chính php để xử lý, thông qua hàm addslashes

– Hai là: dữ liệu đó không làm ảnh hưởng đến cú pháp của câu query, được thêm vào bình thường, nhưng khi hiển thị lên, nó làm cho tài liều html của chúng ta bị lỗi cú pháp.

Ví dụ:
$tieude = ‘Hướng dẫn cách sử dụng thẻ div’;
$noidung = ‘Thẻ div viết đầy đủ là

, đây là một loại thẻ có mặt trong tất cả website’;
mysql_query(“insert into news(title, body) values (‘$tieude’, ‘$noidung’)”);

==> Bạn hãy quan sát $noidung, nó có chứa

, rõ ràng khi hiện thị ra ngoài website, chung với nội dung html của chúng ta, vô tình nó trở thành một element trong cây html của chúng ta, và hiện tại nó đang bị thiếu thẻ đóng
, làm cho cấu chúng html của chúng ta không còn hợp lệ. Những trường hợp nặng hơn, có thể làm cho cả website của chúng ta bị chạy lung tung!!!

Và ứng cử viên được đề cử cho  trường hợp này là hàm htmpspecialchas . Hàm này sẽ thay thế dấu < thành  < và dấu > thành > . Khi đó về mặt nội dung sẽ là:

$noidung = ‘Thẻ div viết đầy đủ là

Xem thêm: Chỉ Số Xét Nghiệm Wbc Là Gì ? Vì Sao Cần Thực Hiện Xét Nghiệm Wbc

, đây là một loại thẻ có mặt trong tất cả website’;

Nhưng khi show lên website thì:  ‘Thẻ div viết đầy đủ là

, đây là một loại thẻ có mặt trong tất cả website’; (do các trình duyệt có khả năng hiểu mã html)

Bài viết khác

Thêm Google Drive vào Menu Send to trên Windows 7 Thiết kế website tư vấn du học cần những gì? Một số biện pháp đối phó khi phát hiện bị DDOS, How to check DDOS Attack and prevent Một số cách cơ bản để kiểm tra server có bị DDoS không Theo dõi Website Uptime 24/7 miễn phí với Google Drive, hỗ trợ SMS Cách sử dụng phần mềm FastStone-Capture quay lại màn hình Hướng dẫn thay đổi tên miền không làm mất đi thứ hạng! Tìm hiểu về Imagick trong PHP Cách phục hồi dung lượng pin laptop vô cùng đơn giản Cách kiểm tra độ chai của PIN laptop dell, hp, asus… ngay trong window Cách sửa lỗi SSL trên trình duyệt Chrome, Firefox, Cốc Cốc Hướng dẫn cập nhật phpBB Export routines via phpmyadmin Kinh doanh bán lẻ: Khuyến mại “Được ăn cả ngã về không” nên thử 7 xu hướng marketing online năm 2016 Ổ cứng SSD là gì? Phân biệt khác nhau giữa ổ cứng SSD và HDD? Trường hợp nào nên sử dụng SSD? Lỗ hổng nghiêm trọng trong OpenSSL cho phép tin tặc giải mã HTTPS Làm sao để có một website chuyên nghiệp? Bảo mật Server Linux hiệu quả hơn Hướng dẫn cấu hình Kloxo MR trước khi sử dụng

Xem thêm: Catalog:Nap Time Pirate – How To Configure Vip Server In Roblox

  • Giới thiệu
  • Blog
  • Thiết kế website
  • Youtube Partner And Network
  • Facebook

Giới thiệu

Điều khoản sử dụngChính sách & Quy định chungQuy định và hình thức thanh toánChính sách bảo mật thông tin

Blog

Lịch sử cập nhậtThông Báo Bảo Trì AAG Kênh Giữa HongKong Và MalaysiaGoogle cho biết bản cập nhật thứ sáu là không phải do các thuật toán PenguinLà một bản cập nhật lớn từ Google tìm kiếm đang xảy ra? Tôi nghĩ như vậy.4 cách viết bài cho SEO, tăng khả năng thành công

Thiết kế website

Báo giá thiết kế website rao vặt trực tuyến

Youtube Partner And Network

“Hôi của” Hình ảnh này mình “hôi của đề xuất” của AfrojackCách tag video của mình sao cho được đánh giá cao trong YouTube và VIDIQTiện ích VidIQ – cần phải có khi chơi youtube

Facebook

Hướng dẫn cài đặt Instant ArticleHướng dẫn sử dụng Graph API Facebook toàn tập – Phần 1