Trong một ngôn ngữ lập trình, tôi thực thi một lệnh shell đơn giản
cd var; echo > create_a_file_here
với var là một biến chứa một chuỗi (hy vọng) một thư mục đến nơi tôi muốn tạo tệp "create_a_file_here". Bây giờ nếu ai đó nhìn thấy dòng mã này, có thể khai thác nó bằng cách gán ví dụ:
var = "; rm -rf /"
Mọi thứ có thể trở nên khá xấu xí. Một cách để tránh trường hợp trên có thể là tìm kiếm chuỗi trong var cho một số ký tự đặc biệt như ';' trước khi thực hiện lệnh shell, nhưng tôi nghi ngờ điều này bao gồm tất cả các khai thác có thể.
Có ai biết một cách tốt để đảm bảo rằng "cd var" chỉ thay đổi một thư mục và không có gì khác không?
sh
, hoặc tạo ngôn ngữ lập trình của riêng bạn với cú pháp tương tự nhưng mở rộng var
thay vì yêu cầu bạn viết cd "$var"
? Hay đây là bash
với shopt -s cdable_vars
? Ồ, tôi nghĩ rằng bạn có nghĩa là một số chương trình khác tạo ra một shell để chạy các lệnh này. Vì vậy, chỉ cần trích dẫn var
, nhưng đảm bảo rằng nó không bao gồm chính một nhân vật trích dẫn ...
s='"'; echo "$s"
bản in "
.
var=untrusted string
trong chương trình cha, vì vậy var
một biến môi trường đã được đặt khi gọi sh
. Sau đó, bạn chỉ cần trích dẫn nó mỗi khi bạn mở rộng nó, đó là điều có thể làm đáng tin cậy. À, tôi thấy ý tưởng đó đã là một phần trong câu trả lời của Stéphane>. <
var
như một đối số. Ví dụ như gọish
với đối số-c
,'cd "$1"; echo > create_a_file_here'
,'sh'
,var
công trình và không cần bất kỳ thay đổi nàovar
. Đối'sh'
số được thông qua là$0
.