Tại sao việc sử dụng mysqli_real_escape_string() lại quan trọng như vậy?

PHP cung cấp mysql_real_escape_string() để thoát các ký tự đặc biệt trong chuỗi trước khi gửi truy vấn tới MySQL. Hàm này đã được nhiều người sử dụng để thoát khỏi các dấu ngoặc đơn trong chuỗi và đồng thời ngăn chặn các cuộc tấn công SQL injection. Tuy nhiên, nó có thể tạo ra các lỗi bảo mật nghiêm trọng khi không được sử dụng đúng cách

nhân vật trốn thoát

Chính xác thì chức năng mysql_real_escape_string làm gì? . Các ký tự đặc biệt được xem xét được liệt kê bên dưới

Các ký tự được thoát bởi mysql_real_escape_string

0x00 (NULL)

Dòng mới (\n)

Vận chuyển trở lại (\r)

Dấu ngoặc kép (")

Dấu gạch chéo ngược (\)

0x1A (Ctrl+Z)

Cách sử dụng đúng

Đây là một cách cổ điển và an toàn để sử dụng chức năng này làm trình khử trùng đầu vào cho các tham số chuỗi


User input (attack attempt).

a' HOẶC 'a'='a

 

Vệ sinh đầu vào

$param = mysql_real_escape_string($_GET['n']);

 

Truy vấn được tạo

CHỌN id TỪ sản phẩm WHERE name=' a\' OR \'a\'=\'a '

Vì ví dụ cuối cùng được bảo mật chống lại các lần tiêm SQL, nên truy vấn được tạo sẽ không trả về kết quả nào (ngoại trừ nếu một sản phẩm thực sự được đặt tên là phân khúc màu xanh lá cây). Điều quan trọng cần nhớ ở đây là bạn phải luôn đặt tham số đã được làm sạch giữa các dấu ngoặc kép khi sử dụng mysql_real_escape_string() nếu không sẽ tạo ra lỗ hổng SQL injection

Làm thế nào để không sử dụng

Các lập trình viên nên thực sự cẩn thận khi sử dụng hàm mysql_real_escape_string để làm sạch các tham số số vì chúng thường được tích hợp trong truy vấn mà không có dấu ngoặc kép. Chức năng được thảo luận trong bài viết này không xác minh các loại dữ liệu; . Đây là một mẫu mã cho thấy cách SQL injection có thể đạt được khi mysql_real_escape_string không được triển khai chính xác


Malicious user input - A numeric value is expected by the script.

9999 HOẶC 1=1

 

Vệ sinh đầu vào

$productid = mysql_real_escape_string($_GET['id']);

 

Truy vấn được tạo

CHỌN tên TỪ sản phẩm WHERE id= 9999 OR 1=1

Khi truy vấn được thực thi, tên của tất cả sản phẩm được trả về vì tham số thủ công do kẻ tấn công gửi được coi là một phần của phân đoạn SQL

Tham số số và mysql_real_escape_string

Như đã nêu trước đó trong bài viết, tham số được làm sạch bởi mysql_real_escape_string phải được đặt giữa các dấu ngoặc kép để tránh SQL injection (bất kể loại dữ liệu nào). Máy chủ MySQL (và DBMS phổ biến khác) hỗ trợ các dấu ngoặc đơn xung quanh các giá trị số. Đây là ví dụ cuối cùng trông như thế nào sau khi sửa lỗi bảo mật

Malicious user input - A numeric value is expected by the script.

9999 HOẶC 1=1

 

Vệ sinh đầu vào

$productid = mysql_real_escape_string($_GET['id']);

 

Đã tạo truy vấn - Tấn công vô hiệu

CHỌN tên TỪ sản phẩm WHERE id=' 9999 OR 1=1 '

Truy vấn cuối cùng sẽ không trả về tên

LIKE Toán tử đại diện

Có một điều cuối cùng cần xem xét khi sử dụng mysql_real_escape_string để làm sạch dữ liệu; . Nó có vẻ tầm thường nhưng trên thực tế nó có thể có tác động đáng kể đến hành vi của truy vấn. Vì những ký tự đó không được thoát, nên chúng được toán tử LIKE coi là ký tự đại diện cổ điển


MySQL LIKE Wildcards (MySQL has only 2 wildcards)

%   Khớp với số lượng ký tự tùy ý (bao gồm cả ký tự 0)

_   Khớp với bất kỳ ký tự đơn nào

Để ngăn khớp ký tự đại diện, bạn phải thoát khỏi ký tự tương ứng bằng dấu gạch chéo ngược. Đây là cách nó có thể được thực hiện

đầu vào của người dùng

John's ca_

 

Vệ sinh dữ liệu (cũng thoát khỏi tất cả các ký tự đại diện MySQL)

$val = mysql_real_escape_string($_GET['p']);

$val = str_replace("%", "\%", $val);

$val = str_replace("_", "\_", $val);

 

Truy vấn được tạo (tìm kiếm tất cả các sản phẩm có mô tả chứa kết quả khớp chính xác của thông tin người dùng nhập vào)

CHỌN * TỪ sản phẩm NƠI mô tả THÍCH '% john\'s ca\_ %'

Ngay cả khi hầu hết thời gian bạn nên thoát các ký tự đại diện, vẫn có một số trường hợp bạn có thể muốn người dùng sử dụng chúng. Chỉ cần lưu ý rằng trong những trường hợp đó, người dùng có thể tạo các chuỗi đầu vào khó khớp và điều này có thể có một số tác động đến hiệu suất đối với toán tử LIKE (sắp có) . Đây không phải là vấn đề nghiêm trọng, tuy nhiên, nếu kẻ tấn công cố gắng làm chậm ứng dụng hoặc thực hiện DDOS thì việc kiểm soát các ký tự đại diện có thể dễ dàng hơn.

Các giải pháp thay thế

Sử dụng mysql_real_escape_string chắc chắn là một cách đơn giản để bảo mật một ứng dụng chống lại việc tiêm SQL, tuy nhiên nó còn lâu mới là thế giới hoàn hảo. Mỗi khi chức năng này được sử dụng để dọn dẹp dữ liệu, nó sẽ gọi chức năng thư viện của MySQL. Đó không phải là vấn đề lớn nhưng nếu bạn thực hiện một số lượng lớn lệnh gọi tới mysql_real_escape_string thì nó sẽ làm chậm máy chủ cơ sở dữ liệu của bạn. Ngoài ra, nếu bạn gọi nhầm chức năng hai lần trên cùng một dữ liệu, bạn sẽ có thông tin không chính xác trong cơ sở dữ liệu của mình

Công dụng của hàm mysqli_real_escape_string() là gì?

Hàm mysqli_real_escape_string() được sử dụng để thoát khỏi các ký tự trong một chuỗi, khiến cho việc sử dụng nó trong câu lệnh SQL là hợp pháp .

Tại sao mysql_real_escape_string cần kết nối?

mysql_real_escape_string() và các câu lệnh đã chuẩn bị cần kết nối với cơ sở dữ liệu để chúng có thể thoát khỏi chuỗi bằng cách sử dụng bộ ký tự thích hợp - nếu không thì SQL .

Tại sao mysqli_real_escape_string không hoạt động?

Các từ khóa đang hoạt động, mysqli_real_escape_string() sẽ không hoạt động--sẽ không thoát khỏi dấu nháy đơn-- nếu nó không có quyền truy cập vào kết nối cơ sở dữ liệu với CHARSET đã thiết lập< . Vấn đề phải là do kết nối cơ sở dữ liệu hoặc bộ ký tự không được đặt. Đầu tiên, sửa lỗi cú pháp và sau đó thử lại. . To the problem should be either with the database connection or the charset not being set. First, fix the syntax error and then try again.

mysql_real_escape_string có an toàn không?

PHP cung cấp mysql_real_escape_string() để thoát các ký tự đặc biệt trong chuỗi trước khi gửi truy vấn tới MySQL. Hàm này đã được nhiều người sử dụng để thoát khỏi các dấu ngoặc đơn trong chuỗi và đồng thời ngăn chặn các cuộc tấn công SQL injection. Tuy nhiên, nó có thể tạo ra các lỗi bảo mật nghiêm trọng khi không được sử dụng đúng cách .