Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mysqli_real_escape_string có đủ để tránh SQL injection hoặc các cuộc tấn công SQL khác không?

Ai đó có thể cho tôi biết liệu nó có an toàn không hoặc nó có dễ bị tấn công SQL Injection hoặc các cuộc tấn công SQL khác không?

Không Như uri2x đã nói, hãy xem nội dung SQL chèn xung quanh mysql_real_escape_string() .

Cách tốt nhất để ngăn chặn việc đưa vào SQL là sử dụng các câu lệnh đã chuẩn bị sẵn. Chúng tách dữ liệu (tham số của bạn) khỏi các hướng dẫn (chuỗi truy vấn SQL) và không để lại bất kỳ chỗ trống nào cho dữ liệu làm nhiễm bẩn cấu trúc truy vấn của bạn. Các câu lệnh chuẩn bị giải quyết một trong các các vấn đề cơ bản về bảo mật ứng dụng .

Đối với trường hợp bạn không thể sử dụng các câu lệnh đã soạn sẵn (ví dụ:LIMIT ), sử dụng danh sách trắng rất nghiêm ngặt cho từng mục đích cụ thể là cách duy nhất để đảm bảo bảo mật.

// This is a string literal whitelist
switch ($sortby) {
    case 'column_b':
    case 'col_c':
        // If it literally matches here, it's safe to use
        break;
    default:
        $sortby = 'rowid';
}

// Only numeric characters will pass through this part of the code thanks to type casting
$start = (int) $start;
$howmany = (int) $howmany;
if ($start < 0) {
    $start = 0;
}
if ($howmany < 1) {
    $howmany = 1;
}

// The actual query execution
$stmt = $db->prepare(
    "SELECT * FROM table WHERE col = ? ORDER BY {$sortby} ASC LIMIT {$start}, {$howmany}"
);
$stmt->execute(['value']);
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);

Tôi cho rằng đoạn mã trên miễn nhiễm với SQL injection, ngay cả trong những trường hợp tối nghĩa. Nếu bạn đang sử dụng MySQL, hãy đảm bảo rằng bạn đã tắt chế độ chuẩn bị giả lập.

$db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql chọn n giá trị tối đa hàng đầu

  2. Cách hoạt động của hàm UCASE () trong MySQL

  3. Giống như Phân biệt chữ hoa chữ thường trong MySQL

  4. MySQL làm thế nào để điền ngày bị thiếu trong phạm vi?

  5. Làm thế nào để có được kích thước của cơ sở dữ liệu MySQL?