2016-08-20 29 views
0

我正在寫一個bash腳本,它需要幾個用戶輸入,主要是目錄路徑和文件名。該程序將創建指定的目錄和文件。在Bash/Shell腳本中的安全輸入驗證

當寫的目錄路徑,我要求絕對路徑 - 〜/ DIR/...,或$ PATH/DIR/..../DIR/...不準。目錄路徑只應以/DIR/DIR/...的形式提供,文件路徑格式爲/DIR/DIR/.../filename,文件名格式爲,文件名爲。 我也想確保用戶沒有添加任何命令行選項(例如,如果我運行sudo,我想確保用戶沒有在他們的輸入中的任何地方附加-u)。

但是,由於目錄路徑和文件名可能包含破折號,下劃線,空格,句點和字母數字字符,因此我並不完全確定清理其輸入的最佳方式。任何其他角色都應該被檢測到。

用戶輸入通過收集讀取。我使用的是Ubuntu系統,只要符合Ubuntu shell,它就可以工作。 假設只安裝了默認的系統軟件包。

多個選項是可以接受的,以處理驗證的各個部分(例如,使用--治療下列數據作爲用於處理目錄路徑的參數,而不是一個命令[由Siguza建議],然後另一種選擇)。

正確映射目錄結構需要絕對路徑。由於我在路徑字符串上執行的功能,任何其他格式的路徑都會導致程序在匹配或附加到其他路徑時錯誤地解釋結構。

謝謝。


什麼工作:我以前接受的答案,用在某些情況下的真實路徑的readlink,並使用-解釋下面的文本作爲參數。如果你想允許相對路徑,那麼使用readlink或realpath的結果作爲你的路徑。如果您想禁止相對路徑,請將原始字符串與readlink或實時路徑的結果進行比較。

+3

大多數命令都支持「 - 」選項,這使得它們將所有以下參數視爲參數,而不是選項/標誌。除此之外,將所有變量用雙引號括起來以避免擴展。 – Siguza

+0

雖然這確實處理了前兩個問題,但用戶仍然可以使用我的程序無法接受的格式整個目錄路徑。我或者需要拒絕無效輸入,或者將其符合有效輸入。 –

+0

回覆:「用戶可以使用我的程序無法接受的格式存放整個目錄路徑,我需要拒絕無效輸入,或將其符合有效輸入」:*或*您可以更改程序以接受此類格式。 。 。 – ruakh

回答

2

你可以做這樣的事情:

#!/bin/bash 

set -e  

while read path; do 
    result=`realpath -m -- "$path"` 
    if [ "$result" != "$path" ] && [ "$result/" != "$path" ] ; then 
     echo "Rejected: $path" 
    else 
     last_char_index=$((${#path}-1)) 
     last_char=${path:$last_char_index:1} 
     if [ "$last_char" == "/" ]; then 
      echo "New directory: $path" 
      mkdir -- "$path" 
     else 
      echo "New file: $path" 
      touch -- "$path" 
     fi 
    fi 
done 

exit 0 

我用realpath趕相對路徑,然後雙引號之間總是使用的用戶輸入,以避免注射的命令(如果有可能的話)。 我想有更好的方法可以做,但目前這是我能想到的。

編輯:如意見建議,我加--以確保文件/目錄名安全給予touchmkdirrealpath

+2

引用變量不會阻止它們被解析爲選項。用'--'來表示。 – Siguza

+0

@Siguza你能否提供一個這個腳本不安全的例子? – yoones

+2

我從來沒有說過它是可以被利用的,但是你可以設置path ='-X'並且在一個無效的選項上有實際的路徑崩潰。你也應該'設置-e;',否則你可以設置path ='''',因爲錯誤信息打印到stderr而不是stdout,實際路徑會崩潰,但是'else'塊會被執行。再次,不可開發,但可能不可取。 – Siguza