Bir programlama dilinde, basit bir kabuk komutu yürütüyorum
cd var; echo > create_a_file_here
ile var ben dosyası "create_a_file_here" oluşturmak istediğiniz yere (umarım) bir dizinin bir dize içeren bir değişken olma. Birisi bu kod satırını görürse, örneğin atayarak koddan yararlanmak mümkündür:
var = "; rm -rf /"
İşler oldukça çirkinleşebilir. Dizeyi aramak için belki olurdu Yukarıdaki durum önlemek için bir yolu var gibi bazı özel karakterler için ';' kabuk komutunu çalıştırmadan önce, ama bu muhtemelen tüm istismarları kapsar şüpheliyim.
Herkes "cd var" sadece bir dizini değiştirmek ve başka bir şey sağlamak için iyi bir yol biliyor mu?
shveya benzer bir sözdizimi ile kendi programlama dili oluştururken ama genişlediği varyerine yazmayı gerektiren cd "$var"? Yoksa bashbununla shopt -s cdable_varsmı? Oh, sanırım başka bir program bu komutları çalıştırmak için bir kabuk çatal. Öyleyse sadece alıntı yapın var, ancak bir alıntı karakterinin kendisini içermediğinden emin olun ...
s='"'; echo "$s"baskılar ".
var=untrusted stringana programda yapın, bu yüzden varçağırırken zaten ayarlanmış bir ortam değişkeni sh. O zaman sadece her genişlettiğinizde alıntı yapmanız gerekir, bu da güvenilir bir şekilde mümkündür. Ah, bu fikrin zaten Stéphane'nin cevabının bir parçası olduğunu görüyorum>. <
varolarak, bir argüman olarak da geçebilirsiniz . Örneğin çağırarakshargümanlarla-c,'cd "$1"; echo > create_a_file_here','sh',varişler ve herhangi bir değişiklik gerekmezvar.'sh'Bağımsız değişken olarak geçirilir$0.