W języku programowania wykonuję proste polecenie powłoki
cd var; echo > create_a_file_here
z var jest zmienną, która zawiera ciąg (miejmy nadzieję) katalogu do miejsca, gdzie chcę, aby utworzyć plik „create_a_file_here”. Teraz, jeśli ktoś zobaczy ten wiersz kodu, można go wykorzystać, przypisując na przykład:
var = "; rm -rf /"
Sprawy mogą być dość brzydkie. Jednym ze sposobów uniknięcia powyższego przypadku może być przeszukanie ciągu w var dla znaków specjalnych, takich jak „;” przed wykonaniem polecenia powłoki, ale wątpię, czy obejmuje to wszystkie możliwe exploity.
Czy ktoś zna dobry sposób na to, aby „cd var” zmieniał tylko katalog i nic więcej?
sh
, czy tworzysz własny język programowania z podobną składnią, ale który rozwija się var
zamiast wymagać pisania cd "$var"
? Czy to jest bash
z shopt -s cdable_vars
? Och, myślę, że masz na myśli, że jakiś inny program prosi powłokę o uruchomienie tych poleceń. Więc po prostu zacytuj var
, ale upewnij się, że nie zawiera on samego znaku cudzysłowu ...
s='"'; echo "$s"
odbitki "
.
var=untrusted string
w programie nadrzędnym, podobnie var
jak zmienna środowiskowa, która jest już ustawiona podczas wywoływania sh
. Następnie musisz go zacytować za każdym razem, gdy go rozszerzysz, co można zrobić niezawodnie. Ach, widzę, że ten pomysł jest już częścią odpowiedzi Stéphane>. <
var
jako argument. Na przykład dzwoniącsh
z argumentami-c
,'cd "$1"; echo > create_a_file_here'
,'sh'
,var
roboty i nie wymaga żadnych zmianvar
.'sh'
Argumentem jest przekazywana jako$0
.