Dữ liệu GET và POST là dữ liệu được gửi trực tiếp từ người dùng. Bạn nhận được nó thô, không có kiểm tra hoặc xác nhận giữa người sử dụng và chương trình của bạn. Ngay cả khi bạn đã xác nhận biểu mẫu nên bắt nguồn dữ liệu, kẻ tấn công có thể tự tạo một yêu cầu với bất kỳ dữ liệu nào mà anh ta muốn. Vì vậy, bạn phải luôn xử lý dữ liệu yêu cầu dưới dạng đầu vào người dùng không tin cậy.
Có một số cuộc tấn công dựa vào bộ mã hóa mà quên dữ liệu yêu cầu đó là không đáng tin cậy, nhưng phổ biến nhất là SQL injection. Nguyên nhân gốc rễ của SQL injection là xây dựng một truy vấn bằng cách ghép các chuỗi thủ công, một số trong đó là đầu vào người dùng không đáng tin cậy. Điều này có nghĩa là bạn đang yêu cầu cơ sở dữ liệu của mình thực thi đầu vào không tin cậy của người dùng.
Giải pháp ngây thơ đối với SQL injection là xác thực các đầu vào và sau đó ghép chúng vào một chuỗi truy vấn, nhưng đây cũng là dạng kém. Bạn đang dựa vào logic xác nhận của bạn để làm cho chuỗi an toàn, và nếu bạn sử dụng sai nó - hoặc logic là lỗi - thì bạn lại một lần nữa bị phơi nhiễm với các cuộc tấn công.
Giải pháp chính xác là tách truy vấn của bạn khỏi dữ liệu chứa trong đó. Hầu như tất cả các bộ điều hợp cơ sở dữ liệu đều hỗ trợ phương pháp này và nếu máy của bạn không vì lý do nào đó, nó không phù hợp để sử dụng. Thành ngữ phổ biến nhất là (không có ngôn ngữ cụ thể):
myDB.query ("select * from Stuff where id =?", [42]);
Điều này sẽ đảm bảo (trong hệ thống như vậy) các tham số không được thực thi. Chuỗi truy vấn được tạo từ dữ liệu hoàn toàn đáng tin cậy, trong khi dữ liệu không tin cậy được tách riêng.Tại tồi tệ nhất, phương pháp này được áp dụng cho đầu vào không đúng có thể dẫn đến dữ liệu không chính xác, không phải là một lệnh không chính xác.
Cách tiếp cận này để tránh SQL injection làm nổi bật nguyên tắc trung tâm áp dụng cho tất cả các loại tấn công dữ liệu yêu cầu: dữ liệu yêu cầu không phải của bạn và không an toàn. Khi xử lý bất kỳ đầu vào người dùng nào, bao gồm cả dữ liệu yêu cầu, luôn luôn giả định rằng nó có nguồn gốc từ kẻ tấn công có kiến thức thân mật về hệ thống của bạn. Nó có vẻ hoang tưởng, nhưng nó giúp bạn an toàn.
Nguồn
2009-08-19 18:58:40
Quy tắc chung là "không tin vào đầu vào của người dùng". Bất kỳ thứ gì đến từ người dùng dưới bất kỳ hình thức nào đều cần phải được kiểm tra an toàn. – Jess