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);