PHP SQL injection là gì?

Truy vấn chọn tất cả các hàng từ bảng người dùng trong đó tên người dùng bằng với tên được đặt trong chuỗi truy vấn. Nếu xem xét cẩn thận, bạn sẽ nhận ra rằng câu lệnh dễ bị SQL Injection - các trích dẫn trong

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
0 không được thoát và do đó sẽ được nối như một phần của câu lệnh, điều này có thể cho phép hành vi nguy hiểm

Xem xét điều gì sẽ xảy ra nếu

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
0 như sau.
 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
2 (một trích dẫn kép, theo sau là một văn bản " OR 1 OR tên người dùng = " theo sau là một trích dẫn kép khác). Khi nối vào biểu thức ban đầu, bạn có một truy vấn giống như thế này.
 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
3. Phần
 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
4 dường như dư thừa được thêm vào là để đảm bảo rằng câu lệnh SQL đánh giá không có lỗi. Nếu không, một trích dẫn kép treo sẽ được để lại ở cuối câu lệnh

Điều này chọn tất cả các hàng từ bảng người dùng

Không bao giờ tin tưởng dữ liệu do người dùng cung cấp, chỉ xử lý dữ liệu này sau khi xác thực; . Trong ví dụ bên dưới, tên người dùng bị giới hạn ở các ký tự chữ và số cộng với dấu gạch dưới và có độ dài từ 8 đến 20 ký tự - sửa đổi nếu cần

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";

Để tăng tính bảo mật, bạn có thể muốn hủy bỏ việc thực thi tập lệnh, thay thế

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
5 bằng
 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
6 hoặc
 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
7

Sự cố này vẫn xảy ra khi sử dụng hộp kiểm, nút radio, danh sách chọn, v.v. Bất kỳ yêu cầu trình duyệt nào (thậm chí

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
8) đều có thể được sao chép thông qua telnet, các trang web trùng lặp, javascript hoặc mã (thậm chí cả PHP), vì vậy hãy luôn thận trọng với mọi hạn chế được đặt đối với mã phía máy khách

PHP cung cấp cho bạn một chức năng để xử lý đầu vào của người dùng trong MySQL và đó là

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
9. Tập lệnh này thoát tất cả các ký tự nguy hiểm tiềm ẩn trong chuỗi được cung cấp và trả về chuỗi đã thoát để có thể an toàn khi đưa vào truy vấn MySQL. Tuy nhiên, nếu bạn không làm sạch đầu vào trước khi chuyển nó tới hàm
 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
10, bạn vẫn có thể có các vectơ tiêm SQL. Ví dụ;

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
1

Nếu

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
12 chứa
 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
13 thì truy vấn kết quả sẽ là

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
6

đó là một vectơ tiêm SQL hợp lệ

(Hàm ban đầu,

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
14, không tính đến bộ ký tự hiện tại để thoát khỏi chuỗi, cũng như không chấp nhận đối số kết nối. Nó không được dùng nữa kể từ PHP 4. 3. 0. )

Ví dụ, hãy xem xét một trong những ví dụ trên

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
8

Điều này có thể được thoát như sau

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
9

Bằng cách này, nếu người dùng cố gắng đưa vào một câu lệnh khác, chẳng hạn như

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
15, thì nó sẽ được hiểu là một phần của tham số mệnh đề WHERE như mong đợi một cách vô hại

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
1

Các dấu gạch chéo ngược được thêm vào bởi

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
11 làm cho MySQL diễn giải chúng dưới dạng các ký tự trích dẫn đơn thực tế chứ không phải là một phần của câu lệnh SQL

Lưu ý rằng MySQL không cho phép xếp chồng các truy vấn nên cuộc tấn công

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
17 sẽ không hoạt động

Gói DB của PEAR cung cấp cơ chế chuẩn bị/thực thi để thực hiện các câu lệnh được tham số hóa

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
4

Phương thức query(), cũng làm tương tự như chuẩn bị/thực thi,

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
5

Chuẩn bị/thực thi sẽ tự động gọi

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
18 như đã thảo luận trong phần trên

Trong PHP phiên bản 5 và MySQL phiên bản 4. 1 trở lên, cũng có thể sử dụng câu lệnh đã chuẩn bị thông qua tiện ích mở rộng

 if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
   $result = mysql_query("SELECT * FROM users WHERE username='$matches[0]'");
 else // we don't bother querying the database
   echo "username not accepted";
19. Thí dụ

SQL injection dùng để làm gì?

SQL injection, còn được gọi là SQLI, là một vectơ tấn công phổ biến sử dụng mã SQL độc hại để thao tác cơ sở dữ liệu phụ trợ nhằm truy cập thông tin không nhằm mục đích hiển thị. This information may include any number of items, including sensitive company data, user lists or private customer details.

PHP có dễ bị SQL injection không?

Trong loại tấn công tiêm nhiễm, tấn công tiêm nhiễm PHP SQL rất nổi bật. Phần lớn các trang web dễ bị tấn công . Theo nghiên cứu, hơn 50% các cuộc tấn công được thực hiện trên web bằng cách sử dụng SQL injection.

Mã tiêm PHP là gì?

Chèn mã PHP là lỗ hổng cho phép kẻ tấn công đưa mã tùy chỉnh vào công cụ tạo tập lệnh phía máy chủ . Lỗ hổng này xảy ra khi kẻ tấn công có thể kiểm soát tất cả hoặc một phần của chuỗi đầu vào được đưa vào lệnh gọi hàm eval().

Ví dụ SQL injection là gì?

Một số ví dụ SQL injection phổ biến bao gồm. Truy xuất dữ liệu ẩn , nơi bạn có thể sửa đổi truy vấn SQL để trả về kết quả bổ sung. Thay đổi logic của ứng dụng, nơi bạn có thể thay đổi truy vấn để can thiệp vào logic của ứng dụng. Các cuộc tấn công UNION, nơi bạn có thể truy xuất dữ liệu từ các bảng cơ sở dữ liệu khác nhau.