CHƯƠNG IV: TẤN CÔNG DATASTORE
4.5 Cách phòng chống
4.5.1 Kiểm tra đầu vào
Để phòng tránh các nguy cơ có thể xảy ra, hãy bảo vệ các câu lệnh SQL là bằng cách kiểm soát chặt chẽ tất cả các dữ liệu nhập nhận được từ đối tượng Request (Request,
Request.QueryString, Request.Form, Request.Cookies, and Request.ServerVariables). Ví dụ, có thể giới hạn chiều dài của chuỗi nhập liệu, hoặc xây dựng hàm EscapeQuotes để thay thế các dấu nháy đơn bằng 2 dấu nháy
đơn như: <% Function EscapeQuotes(sInput) sInput = replace(sInput, " ' ", " ' ' ") EscapeQuotes = sInput 5 End Function %>
Trong trường hợp dữ liệu nhập vào là số, lỗi xuất phát từ việc thay thế một giá trị được tiên đoán là dữ liệu số bằng chuỗi chứa câu lệnh SQL bất hợp pháp. Để tránh điều này, đơn giản hãy kiểm tra dữ liệu có đúng kiểu hay không bằng hàm IsNumeric(). Ngoài ra có thể xây dựng hàm loại bỏ một số kí tự và từ khóa nguy hiểm như: ;, --, select, insert, xp_, … ra khỏi chuỗi dữ liệu nhập từ phía người dùng để hạn chế các tấn công dạng này:
<%
Function KillChars(sInput) dim badChars
dim newChars
badChars = array("select", "drop", ";", "--", "insert", "delete", "xp_") newChars = strInput
for i = 0 to uBound(badChars)
newChars = replace(newChars, badChars(i), "") next
KillChars = newChars End Function
4.5.2 Stored Procedures
Thủ tục lưu trữ đại diện cho những truy vấn được định nghĩa trước trong CSDL.Một thủ tục lưu trữ nhận các giá trị đầu vào và trả về dữ liệu dựa trên những cú pháp đã định sẵn trong thủ tục.Stored procedures có thể chứa những câu lệnh phức tạp với nhiều điều kiện đi kèm
Cú pháp của thủ tục lưu trữ có thể thay đổi ít nhiều giữa các CSDL.Sau đâylà một ví dụ đơn giản về 1 thủ tục lưu trữ nhằm kiểm tra 1 username có trước với mật khẩu ,kết quả trả về là số lượng tìm thấy
CREATE PROCEDRE sp_FooBar(IN user VARCHAR(80), IN passwd CHAR(32), OUT i INT)
BEGIN
SELECT COUNT(id) INTO i FROM UserTable WHERE UserName=user AND Password=passwd; END
Tất nhiên trên thực tế thủ tục lưu trữ có đố phức tạp hơn nhiều ví dụ trên
Không phải tất cả CSDL đều sử dụng thủ tục lưu trữ,đặc biệt lưu ý là PostgreSQL và MySQL 4.x
Ngoài việc cung cấp phương thức thực thi các truy vấn an toàn hơn,thủ tục lưu trữ còn làm tăng hiệu năng truy vấn.
4.5.3 Database Encryption
Nhiều CSDL cung cấp chức năng để mã hóa thông tin bảng và hàng.Việc mã hóa bảng giúp bảo vệ dữ liệu nếu CSDL bị xâm nhập trực tiếp.Việc mã hóa hàng bảo vễ dữ liệu nên chỉ có chủ nhân của dữ liệu mới giải mã được nó.Ví dụ,một cột là user ID,các cột còn lại là những thông tin cá nhân(thông tin tài khoản ngân hàng, số thẻ tín dụng, vv).Nếu tất cả hoặc cột ID được mã hóa(do user ID được dùng để truy vấn) thì hacker sẽ mất nhiều thời gian hơn để giải mã được nó.Nếu cuộc tấn công chỉ sử dụng truy vấn
SELECT và UNION đơn giản thì kết quả trả về chỉ là những dữ liệu không đọc được(dữ liệu mã hóa)
Tất nhiên,đó cũng chưa phải là biên pháp hoàn hảo ngăn chặn cuộc tấn công.Việc tài khoàn bị ăn cắp hay bị dò password là điều hoàn toàn có thể xảy ra.Việc mã hóa cơ sở dữ liệu chỉ ngăn cản những hành động trái phép của user,nó không thể ngăn chặn được những hành vi trái phép(đăng nhập,thực hiện giao dịch…)của kẻ tấn công
4.5.4 Database Configuration
Cần có cơ chế kiểm soát chặt chẽ và giới hạn quyền xử lí dữ liệu đến tài khoản người dùng mà ứng dụng web đang sử dụng. Các ứng dụng thông thường nên tránh dùng đến các quyền như dbo hay sa. Quyền càng bị hạn chế, thiệt hại càng ít. Ngoài ra để tránh các nguy cơ từ SQL Injection attack, nên chú ý loại bỏ bất kì thông tin kĩ thuật nào chứa trong thông điệp chuyển xuống cho người dùng khi ứng dụng có lỗi. Các thông báo lỗi thông thường tiết lộ các chi tiết kĩ thuật có thể cho phép kẻ tấn công biết được điểm yếu của hệ thống.