Bash: správné ošetření vstupu

Honzi

Bash: správné ošetření vstupu
« kdy: 02. 09. 2012, 09:34:27 »
Ahoj, můžete mi prosím někdo zkouknou následující úvahu? Mám jednoduchá skript...

1) je správné užít ' místo "? Pokdu bych dal jen úvozovky, může mi předpokládám skript vykonat i něco nekalého, vzhledem k neošetřeným vstupům. Tzn správně:

DATA_MISTNI='moje' (lokálně zadaná proměnná, měla by obsahovat jen to co chci - ovšem kdo ví)
DATA_NET='něco něco neco' (A část je vstup z netu - teoreticky může obsahovat neznámý kód)

2) Nyní bych je měl mít "proparsované" díky apostrofům výše, takže už se úvozovek bát nemusím (? je to tak?):

echo 'zadaná data: '"$DATA_MISTNI"' a '"$DATA_NET"

3) můžu si dovolit použít předchozí vstupy k provedení nějakého příkazu? Nebo tím riskuju spuštění nechtěného kódu, který "proparsování" přes DATA_NET='něco něco neco' neodstraní?

#proved nejaky prikaz
PRIKAZ="$(sort "$DATA_NET")"
echo ${PRIKAZ}

Může mi v této syntaxi poslední echo spustit nějaký nechtěný kód? Resp jak an to lépe?

Díky moc všem za rady!




« Poslední změna: 03. 09. 2012, 12:36:01 od Petr Krčmář »


Honzi

Re:bash: správné ošetření vstupu
« Odpověď #1 kdy: 02. 09. 2012, 09:43:15 »
PRIKAZ="$(sort "$DATA_NET")"
echo ${PRIKAZ}

Napsal jsem to 3) asi blbě... Jde mi prostě o tom, jak mám provést příkaz kupříkladu jako zde ono "sort", aniž bych riskoval že výsledným prosortováním apod. spustím nějaký kód z toho co sortuju. Abych v sortovaném textu nenarazil na nějaký escape charakter alá ' a skript nezačal vyvádět něco co nechci..

Re:bash: správné ošetření vstupu
« Odpověď #2 kdy: 02. 09. 2012, 14:32:31 »
Ano, pokud to uzavřete do jednoduchých uvozovek, mělo by to být OK, protože shell to vezme jako text, nikoliv příkazy.
Kód: [Vybrat]
Example quoting
my_name="Fred Smith" # Set a variable
echo "$my_name" # Will output - Fred Smith
echo '$my_name' # Will output - $my_name

Kit

Re:bash: správné ošetření vstupu
« Odpověď #3 kdy: 02. 09. 2012, 17:24:59 »
Spíš takto:
Kód: [Vybrat]
PRIKAZ=$(sort "$DATA_NET")
echo "${PRIKAZ}"

Předpokládám, že proměnná $DATA_NET obsahuje název zpracovávaného souboru.

Honzi

Re:Bash: správné ošetření vstupu
« Odpověď #4 kdy: 03. 09. 2012, 21:47:02 »
Děkuju oběma za reakce. Vezmu to od konce....

Jj PRIKAZ=$(sort "$DATA_NET") a echo "${PRIKAZ}" mají vypsat seřazená data ze souboru. Ten je ovšem stažen z netu a nemohu ovlivnit přímo jeho obsah. Může dojít v téhle syntaxi ke spuštění oněch dat?

Sort je jen seřadí a bude je brát předpokládám čistě jako text a je tedy zcela neškodný. (Nebo ho lze nějak přerušit a navázat kódem z jeho obsahu?)

Ale jak to je s "${PRIKAZ}"? Pokud by ona stažená data obsahovala kupříkladu úvozovky atd... A i když je to v teoreticky neškodném echu, je přece možné to uvozovkami v samotném obsahu $PRIKAZ ukoncit a ; začít psát další kód, ne? Jak se mám v bashi správně podobným filutám bránit?

PRIKAZ=$(sort "$DATA_NET")
echo "${PRIKAZ}"

Co když bude jeden z řádků třeba něco jako BLABLA";-nějakýškodlivýkód-;"BLA ? Mě se to zatím zrealizovat nepovedlo ,ale to že to neumím napsat já mě až tak nepřekvapuje :). Co s tím? Je to zbytečné? Nebo není a co je neznámé (což je teoreticky vše zvenčí) parsovat hned na vstupu? Nebo je tu něco jako specialchars?


Lol Phirae

Re:Bash: správné ošetření vstupu
« Odpověď #5 kdy: 03. 09. 2012, 22:05:37 »
Není nad to řešit neexistující problém...

Kód: [Vybrat]
man bash

    echo [-neE] [arg ...]
              Output the args, separated by spaces, followed by a newline.  The return status is always 0.

Built-in příkaz echo nic nespouští!

Kit

Re:Bash: správné ošetření vstupu
« Odpověď #6 kdy: 04. 09. 2012, 09:16:10 »
Jj PRIKAZ=$(sort "$DATA_NET") a echo "${PRIKAZ}" mají vypsat seřazená data ze souboru. Ten je ovšem stažen z netu a nemohu ovlivnit přímo jeho obsah. Může dojít v téhle syntaxi ke spuštění oněch dat?

Ne. Samozřejmě jen za předpokladu, že proměnná $DATA_NET neobsahuje data, ale jen název souboru s daty.

Samozřejmě existuje elegantnější varianta
Kód: [Vybrat]
sort "$DATA_NET"která dělá totéž, resp. ještě jednodušší
Kód: [Vybrat]
curl -s "http://url" | sortkterá to dělá i se stažením a je o něco rychlejší.

Sort je jen seřadí a bude je brát předpokládám čistě jako text a je tedy zcela neškodný. (Nebo ho lze nějak přerušit a navázat kódem z jeho obsahu?)

Sort není interpretr, ale program na seřazení dat. A data nejsou skript, ale jen data.

Ale jak to je s "${PRIKAZ}"? Pokud by ona stažená data obsahovala kupříkladu úvozovky atd... A i když je to v teoreticky neškodném echu, je přece možné to uvozovkami v samotném obsahu $PRIKAZ ukoncit a ; začít psát další kód, ne? Jak se mám v bashi správně podobným filutám bránit?

"${PRIKAZ}" se nevyhodnocuje rekurzívně. Tedy dokud nepoužiješ eval. Ale stejně je výhodnější tento obrat nepoužívat, viz výše.

Honzi

Re:Bash: správné ošetření vstupu
« Odpověď #7 kdy: 04. 09. 2012, 17:24:43 »
Lol Phirae:
Ne, horší je neřešit exitující problém o kterém nevíš, že exituje :)

Potíž je v tom, že jsem nevěděl, zda není možné za pomocí '/;/čehovímještě echo escapnout a začít spouštět vlastní kód. Což btw nevím do teď.

Kit:
Díky za vysvětlení a příklad. Je to samozřejmě lepší :)

Zneužil bych vás ještě na dvě poslední otázky..

1) Jaká je obecně vhodná kontrukce, pokud bych si potřeboval poskládat vlastní příkaz z více proměnných a následně ho "spustit" a odchytit jeho výsledek? Konkrétně např. zjistit, zda je v obsahu složku určitý soubor dany proměnnou $HLEDANY a pokud ano, udělat něco. Já bych psal:

Kód: [Vybrat]
TEST="$(ls | grep "$HLEDANY")"

if [ "${TEST}" != "neco" ] ; then

 ..

elif [ "${TEST}" != "neco jineho" ] ; then

 ..

fi

2) Máte tip na nějakou dobrou (=aktuální a nešířící bludy) knižnici, jak proniknout do bashe? Děkuju vám za pomoc, jsem zatím samouk ze zdrojů na netu a chybí mi "mistr" na konzultace :)

Kit

Re:Bash: správné ošetření vstupu
« Odpověď #8 kdy: 04. 09. 2012, 23:57:16 »
1) Jaká je obecně vhodná kontrukce, pokud bych si potřeboval poskládat vlastní příkaz z více proměnných a následně ho "spustit" a odchytit jeho výsledek? Konkrétně např. zjistit, zda je v obsahu složku určitý soubor dany proměnnou $HLEDANY a pokud ano, udělat něco. Já bych psal:

Kód: [Vybrat]
TEST="$(ls | grep "$HLEDANY")"

Místo této konstrukce bych raději zkusil příkaz
Kód: [Vybrat]
find -name "$HLEDANY" -exec ...

Honzi

Re:Bash: správné ošetření vstupu
« Odpověď #9 kdy: 15. 09. 2012, 22:03:05 »
Místo této konstrukce bych raději zkusil příkaz

Díky za tip, trochu jsem pokusoval v tomto směru, ovšem stejně jsem nepřišel na to, jak elegantně udělat nějakou podmínku a v návaznosti na ní if i else. Z nichž kupříkladu jeden výsledek podmínky vypíše (uloží, odešle... to už je fuk. Prostě "získá" jako text.)

Vámi uvedený příkaz řeší vlastně jen jednu reakci, jak správně udělat if/elseif/else?

PS: S literaturou je to horší, než jsem si myslel..

PJ

Re:Bash: správné ošetření vstupu
« Odpověď #10 kdy: 16. 09. 2012, 23:05:04 »
Místo této konstrukce bych raději zkusil příkaz
Kód: [Vybrat]
find -name "$HLEDANY" -exec ...
Na podobnost s tym ls by to chcelo este obmedzit hlbku
Kód: [Vybrat]
find [b]-maxdepth 1[/b] -name "$HLEDANY" ...

Honzi

Re:Bash: správné ošetření vstupu
« Odpověď #11 kdy: 18. 09. 2012, 14:54:12 »
A jak je možné správně v bashi vytvořit podmínku s if i else?

Lol Phirae

Re:Bash: správné ošetření vstupu
« Odpověď #12 kdy: 18. 09. 2012, 16:17:14 »
 ;D :D ::) ;D :D ::) ;D :D ::)