Lập trình back-end
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| route/ruːt/ | đường dẫn |
| validate input/ˈvælɪdeɪt ˈɪnpʊt/ | kiểm tra đầu vào |
| status/ˈsteɪtəs/ | trạng thái |
| SQL injection/ˌes kjuː ˈel ɪnˈdʒekʃn/ | lỗi SQL |
| parameterised query/ˌpærəˈmetəraɪzd ˈkwɪərɪ/ | truy vấn tham số hóa |
Chuỗi tìm kiếm thay đổi truy vấn
- Một cuộc tìm kiếm theo tên nhận được
' OR 1=1 --. Nếu mã chèn trực tiếp văn bản này vào SQL, văn bản đó có thể làm thay đổi điều kiện thay vì vẫn giữ nguyên là một tên. - Một đường dẫn (route) ánh xạ phương pháp và đường dẫn yêu cầu đến hàm xử lý tương ứng. Hãy giữ hợp đồng đường dẫn rõ ràng trước khi triển khai việc tra cứu.
Kiểm tra cấu trúc và quyền hạn
- Xác thực đầu vào nghĩa là kiểm tra các giá trị bắt buộc, kiểu dữ liệu, độ dài được phép và phạm vi. Hãy kiểm tra quyền hạn của người gọi riêng biệt.
- Một trạng thái (status) mô tả kết quả: 200 cho việc tra cứu thành công này, 400 cho đầu vào không hợp lệ và 404 cho tài nguyên không tồn tại. Các trường hợp thất bại về quyền hạn cần tuân theo chính sách đã thống nhất của ứng dụng; chúng không tự động là đầu vào sai.
Ghép những kết quả này theo hợp đồng tuyến đường của bài học.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Những ý nghĩa này tự thân chúng không xác định cách lỗi quyền riêng tư nên được biểu diễn.
Giữ các giá trị bên ngoài văn bản SQL
- Lỗi chèn SQL (SQL injection) xảy ra khi văn bản không đáng tin cậy trở thành một phần của cú pháp SQL. Một truy vấn tham số hóa (parameterised query) liên kết một giá trị riêng biệt với câu lệnh.
- Các ký hiệu placeholder liên kết các giá trị, không phải tên bảng tùy ý hay hướng sắp xếp. Hãy chọn các định danh như vậy từ một danh sách trắng cố định trên máy chủ khi một đường dẫn yêu cầu chúng.
Phép tra cứu nào giữ tên đã nhập tách biệt khỏi cú pháp SQL?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Gắn giá trị giúp chúng tách biệt khỏi câu lệnh cố định.
Giải thích việc gán tên cho một dấu ngoặc trong SQL sẽ thay đổi điều gì.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
Câu lệnh vẫn được cố định trong khi giá trị được gắn riêng biệt vẫn là dữ liệu.
Dấu ngoặc giá trị có thể đại diện an toàn cho bất kỳ tên bảng hoặc hướng sắp xếp nào.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Dấu ngoặc gắn các giá trị. Chọn các định danh động từ một danh sách cho phép cố định phía máy chủ.
Chạy một ví dụ cục bộ hoàn chỉnh
- Lưu và chạy ví dụ Python này bằng SQLite. Chuỗi bất thường được lưu dưới dạng tên, sau đó tìm kiếm như một giá trị đã gắn.
- Kết quả chỉ chứa dòng có tên đó. Gắn giá trị ngăn không cho nó trở thành cú pháp SQL; điều này không thiết lập quyền hay làm cho mọi ứng dụng an toàn.
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE students (id INTEGER PRIMARY KEY, name TEXT)")
name = "' OR 1=1 --"
con.executemany("INSERT INTO students VALUES (?, ?)", [(1, "Mei"), (2, name)])
rows = con.execute("SELECT id FROM students WHERE name = ?", (name,)).fetchall()
print(rows) # [(2,)]
con.close()
Ví dụ SQLite hoàn chỉnh sẽ in ra kết quả gì?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Chuỗi bất thường được lưu trữ và sau đó được khớp như một tên gốc.
Giữ các lỗi hữu ích và riêng tư
- Gửi cho trình duyệt một thông điệp rõ ràng mà nó có thể xử lý, chẳng hạn như trường hợp không hợp lệ hoặc sự cố tạm thời. Không trả về lỗi SQL thô, thông tin xác thực riêng tư hoặc stack trace.
- Ghi lại chi tiết chẩn đoán chỉ trong nhật ký được bảo vệ với các giá nhạy cảm đã bị loại bỏ. Ghi đủ ngữ cảnh để điều tra mà không cần sao chép toàn bộ nội dung yêu cầu riêng tư.
Trả về lỗi cơ sở dữ liệu thô cho người dùng thông thường để họ có thể khắc phục sự cố SQL.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Trả về các thông báo an toàn và hữu ích; bảo vệ nhật ký chẩn đoán và loại bỏ các giá trị nhạy cảm.
Kiểm chứng nhiều hơn cả đường dẫn thành công
- Kiểm tra đầu vào hợp lệ, thiếu, sai kiểu và quá lớn; truy cập bị từ chối; kết quả khớp rỗng; và sự cố cơ sở dữ liệu mô phỏng. Nêu kết quả mong đợi cho từng trường hợp.
- Giữ mọi giá trị động đã gắn, bao gồm cả giá trị của danh sách thả xuống. Danh sách trên trình duyệt không ngăn chặn việc ai đó gửi trực tiếp một giá trị khác.
Xác thực yêu cầu, cấp quyền cho người gọi và gắn các giá trị dữ liệu. Những hành động này giải quyết các vấn đề khác nhau; không cái nào thay thế cái nào.
Đầu vào bên ngoài nào cần kiểm tra máy chủ phù hợp? Chọn tất cả các đáp án đúng.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Các giá trị bên ngoài trông bình thường vẫn có thể có sai kiểu dữ liệu, độ dài hoặc quyền hạn.
Một truy vấn được tham số hóa, nhưng mọi người gọi đều có thể đọc các hàng sinh viên riêng tư. Điều gì còn thiếu?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Gắn địa chỉ là sự tiêm các giá trị; nó không cấp quyền truy cập cho người gọi.