2009-12-05 19 views
3

我從來沒有編程過,但需要寫一個非常簡單的webapp工作。爲什麼我的Perl反引號抱怨「sh:第1行:any:command not found」?

我試圖讓這個掏查詢工作:

dig @8.8.8.8 +nocomments +nostats +noquestion +nocmd google.com any 

通過此位的Perl:

$dig = `/usr/bin/dig \@8.8.8.8 +nocomments +nostats +noquestion +nocmd $query any`; 

除了它似乎並沒有認識到「任何」末的挖掘,給我:

sh: line 1: any: command not found 

什麼愚蠢簡單的事情我在做正確?

+6

這個愚蠢簡單的事情可能與信任$ query的內容有關。等待受到攻擊的HACK。 – Don 2009-12-05 06:01:51

+0

與你的問題無關,但考慮使用qx而不是反引號 – 2009-12-06 18:09:41

回答

11

我敢打賭$query中有一個換行符,導致你的shell看到any作爲一個新的命令。

嘗試的系統調用之前做chomp $query;刪除的換行符。更多關於chomp

+0

是的,就是這樣 - 謝謝。 – scraft3613 2009-12-05 06:00:24

+2

Net :: DNS :: Resolver有很多更安全的方法來執行此查詢。 – 2009-12-07 01:20:51

1

最有可能的,它的東西,是在打碎的命令字符串的$ query變量。你能給我們一個失敗的例子,並給出錯誤嗎?或者多出一點你的劇本?

2

你或許應該使用dig ... '$query'所以它的單引號當外殼看到它。如果你不這樣做,那麼shell將解釋任何元字符。如果有人將"; echo my_key > ~/.ssh/authorized_keys"放入您的網絡表單中,那麼您就搞砸了。即使它僅供內部使用,如果某人在查詢中放置了一些空格(shell將分詞並將其作爲兩個參數進行挖掘),您不希望其中斷。

您可以使用perl的

\Q$query\E
擴展$查詢與永遠潛在的元字符\逃逸。實際上,這比添加單引號要好得多,如果查詢包含單引號字符,它將打破引號。仍然非常容易攻擊。這 should fix that in into your memory

Perl有安全的方式使用系統()函數的字符串列表來指定指定參數時,避免/ bin/sh的,而不是一個字符串進行評估的shell命令。這是最安全的方法,但還有的沒有回剔版,而不想管自己& &叉& &高管。

+0

editted指出,單引號不會使其安全。並鏈接到http://xkcd.com/327/ – 2009-12-06 03:45:04

相關問題