Ví dụ của bạn an toàn. Trong thực tế, nó đã được an toàn với printf
. Giống như printf
, Boost.Format chỉ phân tích cú pháp chuỗi định dạng của nó một lần, vì vậy không có cơ hội chèn thêm định dạng specifier. Chuyển một đối tượng format
không đầy đủ đến boost::format
ném ngoại lệ.
Tôi đoán điều bạn sợ là format string exploits. Đó là, tôi nghĩ, không thể sử dụng Boost.Format. Những lý do tại sao printf
là dễ bị tổn thương được tóm tắt bởi Cowan et al.:
%n
cho phép bằng văn bản cho vị trí bộ nhớ tùy ý.
varargs
không cho phép tính đối số, do đó, chuỗi có thể in toàn bộ vùng.
varargs
không an toàn kiểu.
quảng cáo (1), %n
đã omitted từ Boost.Format "vì nó không phù hợp trong bối cảnh này." Quảng cáo (2), Boost.Format không sử dụng varargs
và ném ngoại lệ khi số đối số không phù hợp với chuỗi định dạng. Quảng cáo (3), điều này được giải quyết vì các đối số cho operator%
được kiểm tra tại thời gian biên dịch.
(Tôi chỉ cố gắng để có được Boost.Format để in địa chỉ của một chuỗi C trong bộ nhớ sử dụng một chuỗi định dạng tùy chỉnh, và nó sẽ không cho phép tôi.)
Hơn nữa, lỗi tràn bộ đệm trong sprintf
là tránh vì chuỗi được phân bổ động.
Nếu bạn muốn ở bên an toàn, không sử dụng chuỗi định dạng từ các nguồn không đáng tin cậy.
Nguồn
2010-10-22 10:03:18