Từ hướng dẫn của findutils:
Ví dụ các cấu trúc như hai lệnh này
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;
rất nguy hiểm Lý do cho điều này là '{}' được mở rộng thành tên tệp có thể chứa dấu chấm phẩy hoặc các ký tự khác đặc biệt cho trình bao. Ví dụ, nếu ai đó tạo tệp
/tmp/foo; rm -rf $HOME
thì hai lệnh trên có thể xóa thư mục chính của ai đó.Vì vậy, vì lý do này, không chạy bất kỳ lệnh nào sẽ truyền dữ liệu không đáng tin cậy (chẳng hạn như tên của fi les) cho các lệnh diễn giải các đối số dưới dạng các lệnh sẽ được diễn giải thêm (ví dụ 'sh').
Trong trường hợp của vỏ, có một cách giải quyết thông minh cho vấn đề này:
# safer find -exec sh -c 'something "$@"' sh {} \; find -execdir sh -c 'something "$@"' sh {} \;
Cách tiếp cận này không được đảm bảo để tránh mọi vấn đề, nhưng nó an toàn hơn nhiều so với việc thay thế dữ liệu của sự lựa chọn của kẻ tấn công vào văn bản của lệnh shell.
- Là nguyên nhân của vấn đề trong
find -exec sh -c "something {}" \;
đó thay thế cho không{}
được trích dẫn và do đó không được coi là một chuỗi? Trong giải pháp
find -exec sh -c 'something "$@"' sh {} \;
,đầu tiên
{}
được thay thế, nhưng vì không{}
được trích dẫn, nên"$@"
cũng không có vấn đề tương tự như lệnh ban đầu? Ví dụ,"$@"
sẽ được mở rộng để"/tmp/foo;"
,"rm"
,"-rf"
, và"$HOME"
?Tại sao
{}
không thoát hoặc trích dẫn?
- Bạn có thể đưa ra các ví dụ khác (vẫn có
sh -c
hoặc không có nếu có thể, có hoặc khôngfind
có thể không cần thiết) khi áp dụng cùng loại vấn đề và giải pháp, và đó là những ví dụ tối thiểu để chúng tôi có thể tập trung vào vấn đề và giải pháp với ít phân tâm nhất có thể? Xem các cách để cung cấp các đối số cho một lệnh được thực thi bởi `bash -c`
Cảm ơn.