
Bảo mật cho công cụ nội bộ: tránh lệnh tùy ý, kiểm tra đường dẫn đầu vào và quyền ghi
#Bảo mật#Python1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
Công cụ nội bộ vẫn cần cẩn thận: đường dẫn người dùng nhập có thể trỏ ra ngoài thư mục cho phép, tên file có thể chứa ký tự nguy hiểm. Vài quy tắc đơn giản ngăn phần lớn rủi ro.
Bảo mật cho công cụ nội bộCác bước thực hiện
- Giới hạn thư mục làm việc. Chỉ cho phép đọc ghi trong danh sách thư mục.
- Chuẩn hóa đường dẫn. os.path.realpath để loại .. và liên kết.
- Kiểm tra phần mở rộng. Chỉ nhận .prt, .stp...
- Không chạy lệnh từ dữ liệu. Không dùng eval/exec/shell=True với chuỗi từ người dùng.
- Ghi log truy cập. Ai làm gì, lúc nào.
Code tham khảo (Python)
import os THU_MUC_CHO_PHEP = ["D:/Du_an", "D:/NXLab_xuat"] DUOI_CHO_PHEP = {".prt", ".stp", ".step", ".pdf", ".csv"} class DuongDanKhongHopLe(Exception): pass def kiem_tra_duong_dan(duong_dan): thuc = os.path.realpath(duong_dan).replace("\\", "/") for goc in THU_MUC_CHO_PHEP: goc_thuc = os.path.realpath(goc).replace("\\", "/").rstrip("/") + "/" if (thuc + "/").lower().startswith(goc_thuc.lower()): break else: raise DuongDanKhongHopLe("Ngoài thư mục cho phép: " + thuc) duoi = os.path.splitext(thuc)[1].lower() if duoi not in DUOI_CHO_PHEP: raise DuongDanKhongHopLe("Loại file không cho phép: " + duoi) return thuc def main(): thu = [ "D:/Du_an/ban_ve/a.prt", "D:/Du_an/../Windows/System32/config/SAM", "C:/Users/Public/x.prt", "D:/NXLab_xuat/bao_cao.exe", ] for p in thu: try: print("OK ", kiem_tra_duong_dan(p)) except DuongDanKhongHopLe as ex: print("TỪ CHỐI", p, "->", ex) if __name__ == "__main__": main()Giải thích code
realpathđưa đường dẫn về dạng tuyệt đối thật, loại bỏ..và liên kết tượng trưng; so sánh tiền tố sau bước đó mới an toàn.- Thêm dấu
/vào cuối khi so sánh đểD:/Du_an2không bị coi là nằm trongD:/Du_an. - Danh sách trắng phần mở rộng ngăn script vô tình ghi hoặc đọc loại file không mong muốn.
Lỗi thường gặp
- Danh sách trắng chặt hơn danh sách đen; liệt kê những gì được phép thay vì cấm những gì nghĩ ra.
- Không bao giờ ghép đầu vào người dùng vào lệnh shell; dùng
subprocessvới danh sách đối số.
Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.
Điểm: 0
Trả lời
Đăng nhập để tham gia thảo luận.