Có hai điều rất quan trọng bạn phải làm để tránh các vấn đề nghiêm trọng về bảo mật.
-
Bạn cần thoát khỏi đầu vào của người dùng trước khi đưa nó vào truy vấn SQL của mình. Thoát có nghĩa là thoát tất cả các ký tự đặc biệt như
'
; may mắn thay, có một chức năng đã tự động thực hiện nó: mysql_real_escape_string .Nếu bạn không thoát khỏi đầu vào của người dùng, những điều khó chịu có thể xảy ra. Hãy tưởng tượng rằng truy vấn của bạn là
INSERT INTO userdata VALUES ('$user_data')
. Bây giờ hãy tưởng tượng rằng người dùng đã viết'; DROP DATABASE userdata;
.Nếu bạn không thoát khỏi nó, truy vấn của bạn sẽ trở thành:
INSERT INTO userdata VALUES (''; DROP DATABASE userdata;')
. Như bạn có thể tưởng tượng, điều này không tốt:nếu bạn đã bật nhiều câu lệnh, bạn có thể tạm biệt cơ sở dữ liệu của mình. Đây được gọi là SQL Injection tấn công. -
Khi bạn xuất biến của mình cho người dùng, bạn cũng cần phải thay thế đúng cách các ký tự đặc biệt HTML bằng các thực thể HTML. May mắn thay, có một chức năng để làm điều đó: htmlspecialchars () . Nó sẽ biến đổi các ký tự HTML đặc biệt như
<
tới<
.Đây tưởng chừng là một vấn đề thường bị đánh giá thấp nhưng thực tế lại rất nghiêm trọng. Hãy tưởng tượng nếu
$user_data
chứa<script>SomeNastyScript()</script>
. Nó có thể khai thác các lỗ hổng hiện có trong trình duyệt của người dùng của bạn hoặc nó có thể gửi một cookie không phải HTTPOnly (có thể chứa các mật khẩu đã lưu) cho kẻ tấn công hoặc nó có thể lừa người dùng viết mật khẩu của họ trên một biểu mẫu được tạo thông qua thao tác của DOM (có thể có trong javascript) hoặc rất nhiều thứ khác.Đây được gọi là XSS (Tập lệnh trên nhiều trang web).
Phiên bản ngắn
-
Gọi
mysql_real_escape_string
trên chuỗi trước khi chèn nó vào truy vấn SQL của bạn (nhưng không phải khi bạnecho
nó). -
Gọi
htmlspecialchars
trên chuỗi trước khi hiển thị cho người dùng (nhưng không hiển thị khi bạn đặt nó vào cơ sở dữ liệu).