MySQL ngăn chặn việc tiêm sql như thế nào? Nguyên tắc và cách phòng ngừa của SQL injection

MySQLLàm thế nào để ngăn chặn tiêm sql? Nguyên tắc và cách phòng ngừa của SQL injection

MySQL và SQL injection

Nếu bạn lấy dữ liệu được nhập bởi người dùng thông qua một trang web và chèn nó vàoCơ sở dữ liệu MySQL, thì có thể có vấn đề về bảo mật SQL injection.

Chương này sẽ giới thiệu cách ngăn chặn việc đưa vào SQL và lọc các ký tự được chèn vào trong SQL thông qua các tập lệnh.

Cái gọi là SQL injection là để đánh lừa máy chủ thực thi các lệnh SQL độc hại bằng cách chèn các lệnh SQL vào biểu mẫu web để gửi hoặc nhập chuỗi truy vấn của tên miền hoặc yêu cầu trang.

Chúng ta đừng bao giờ tin tưởng đầu vào của người dùng, chúng ta phải cho rằng dữ liệu đầu vào của người dùng là không an toàn và tất cả chúng ta cần lọc dữ liệu đầu vào của người dùng.

Trong ví dụ sau, tên người dùng đã nhập phải là sự kết hợp của các chữ cái, số và dấu gạch dưới và tên người dùng phải dài từ 8 đến 20 ký tự:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, "SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 输入异常";
}

Chúng ta hãy xem xét tình huống SQL xảy ra khi không có ký tự đặc biệt nào được lọc:

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Trong câu lệnh tiêm ở trên, chúng tôi đã không lọc biến $ name và câu lệnh SQL mà chúng tôi không cần được chèn vào $ name, điều này sẽ xóa tất cả dữ liệu trong bảng người dùng.

mysqli_query () trong PHP không được phép thực thi nhiều câu lệnh SQL, nhưng trong SQLite và PostgreSQL, nhiều câu lệnh SQL có thể được thực thi cùng một lúc, vì vậy chúng ta cần xác minh nghiêm ngặt dữ liệu của những người dùng này.

Để ngăn chặn SQL injection, chúng ta cần chú ý những điểm sau:

  • 1. Không bao giờ tin tưởng đầu vào của người dùng.Kiểm tra đầu vào của người dùng, bạn có thể sử dụng các biểu thức chính quy hoặc giới hạn độ dài; chuyển đổi dấu nháy đơn và dấu "-" kép, v.v.
  • 2. Không bao giờ sử dụng sql lắp ráp động, bạn có thể sử dụng sql được tham số hóa hoặc sử dụng trực tiếp các thủ tục được lưu trữ để truy vấn và truy cập dữ liệu.
  • 3. Không bao giờ sử dụng các kết nối cơ sở dữ liệu với các đặc quyền của quản trị viên, hãy sử dụng các kết nối cơ sở dữ liệu riêng biệt với các đặc quyền hạn chế cho từng ứng dụng.
  • 4. Không lưu trữ thông tin bí mật trực tiếp, mã hóa hoặc băm mật khẩu và thông tin nhạy cảm.
  • 5. Thông tin ngoại lệ của ứng dụng nên đưa ra ít gợi ý nhất có thể và tốt nhất là sử dụng thông tin lỗi tùy chỉnh để bao bọc thông tin lỗi ban đầu
  • 6. Phương pháp phát hiện tiêm sql thường sử dụng phụ trợ软件Hoặc nền tảng trang web để phát hiện, phần mềm nói chung sử dụng công cụ phát hiện tiêm sql jsky, và nền tảng trang web có công cụ phát hiện nền tảng bảo mật trang web Yisi. MDCSOFT SCAN và cộng sự.Sử dụng MDCSOFT-IPS có thể bảo vệ hiệu quả chống lại các cuộc tấn công SQL injection, XSS, v.v.

Ngăn chặn SQL Injection

Trong các ngôn ngữ kịch bản như Perl và PHP, bạn có thể thoát dữ liệu do người dùng nhập vào để ngăn chặn việc đưa vào SQL.

Phần mở rộng MySQL cho PHP cung cấp hàm mysqli_real_escape_string () để thoát các ký tự đầu vào đặc biệt.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Injection trong Like Statements

Khi truy vấn như thế nào, nếu người dùng nhập các giá trị bằng "_" và "%", điều này sẽ xảy ra: ban đầu người dùng muốn truy vấn "abcd_", nhưng kết quả truy vấn bao gồm "abcd_", "abcde" và "abcdf " v.v.; sự cố cũng xảy ra khi người dùng muốn truy vấn "30%" (lưu ý: ba mươi phần trăm).

Trong tập lệnh PHP, chúng ta có thể sử dụng hàm addcslashes () để xử lý tình huống trên, như trong ví dụ sau:

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

Hàm addcslashes () thêm dấu gạch chéo ngược trước ký tự được chỉ định.

Định dạng cú pháp:

addcslashes(string,characters)
参数描述
chuỗiYêu cầu.Chỉ định chuỗi để kiểm tra.
nhân vậtKhông bắt buộc.Chỉ định ký tự hoặc phạm vi ký tự bị ảnh hưởng bởi addcslashes ().

Hy vọng Chen Weiliang Blog ( https://www.chenweiliang.com/ ) đã chia sẻ "Làm cách nào để MySQL ngăn chặn việc tiêm sql? nguyên tắc và cách phòng ngừa tiêm sql ”, nó sẽ giúp ích cho bạn.

Chào mừng bạn đến chia sẻ liên kết của bài viết này:https://www.chenweiliang.com/cwl-500.html

Chào mừng bạn đến với kênh Telegram trên blog của Chen Weiliang để cập nhật những thông tin mới nhất!

🔔 Hãy là người đầu tiên nhận được "Hướng dẫn sử dụng Công cụ AI tiếp thị nội dung ChatGPT" có giá trị trong thư mục trên cùng của kênh! 🌟
📚 Hướng dẫn này chứa đựng giá trị to lớn, 🌟Đây là cơ hội hiếm có, đừng bỏ lỡ! ⏰⌛💨
Chia sẻ và thích nếu bạn thích!
Chia sẻ và thích của bạn là động lực không ngừng của chúng tôi!

 

发表 评论

Địa chỉ email của bạn sẽ không được công bố. 项 已 * 标注

cuộn lên trên cùng