2010-01-02 75 views
3

我想知道下面的代碼是否存在潛在的安全風險。我用這個在我的博客,每當用戶提交一個評論,它給我發了一條短信:在PHP的mail()函數中是否有注入風險?

mail('[email protected]', '', 
    "Comment posted by $name: $comment", 
    "From: [email protected]"); 

$name$comment是還沒有真正被以任何方式消毒用戶輸入的值。用戶是否有可能在這裏做任何惡意的事情? mail()文檔對此沒有任何說明,但將用戶輸入的值直接粘貼到字符串中感覺不對。有沒有真正的風險,還是我只是偏執狂?

+0

我不認爲任何惡意行爲都可以完成,但是你應該限制一些變量的長度,這樣你就不會讓別人失望。 – 2010-01-02 21:42:28

+0

作爲便箋,您引用'cellnumber',所以我假定您正在使用郵件到SMS服務。如果你從某個角度對這些消息收取費用,也許有人會用1000多條評論來炸你,並造成一些損害。 – 2010-01-02 22:17:30

+0

你有那裏的好系統。我不能通過郵件發送短信到我的手機:( – AntonioCS 2010-01-03 01:21:18

回答

5

只要所有用戶的東西我保存在郵件機構,那麼沒有注射風險。

但是,只要用戶可以影響郵件標題,他們就可以注入額外的標題並執行諸如使用它來垃圾郵件任意電子郵件地址或包含完全不同的消息(包括附件)。

如果您檢查影響標題的部分中的換行符,並在出現時拒絕,則應該足夠了。 SMTP標準使用CRLF來分隔標題行,但AFAIK,許多基於Unix的服務器都希望你只使用LF(因爲這是這些系統上的本地行分隔符)。郵件轉發器會在發送到上游時轉換它。

+0

借調。這裏沒有直接的風險,因爲一切都在身體中,但記住標題很脆弱很重要。 – 2010-01-02 22:15:32

2

PHP充滿了不安全的東西,但我不確定這裏有很多風險。

當然,太長的評論可能會溢出您可能對郵件大小的任何限制。這可能不會傷害你。

PHP的$XXX語法擴展字符串,但不做任何進一步的評估XXX是嗎?如果$XXX的工作方式類似於某種eval(),那麼您將處於一個遠程代碼執行的世界,但我不認爲這是事實。

如果這是在內部執行SMTP,那麼在一行後接一個空行的.會標示郵件的結束,理論上攻擊者可以在連續行中使用更多文本來將郵件劫持到郵件一些其他的消息給別人。這就是如果PHP首先無法識別並逃避這樣的字符串。這是我想看的東西。

+0

不,它不會做任何評估。只用了數年的時間和sql一起使我感到緊張,因爲在這種情況下總會存在SQL注入的風險 – Jenni 2010-01-03 02:14:19

3

請注意名稱內的換行符。兩個結果(erm ..原諒我的英文,兩個新行一個接一個)換行符在SMTP中意味着「結尾」。

此外,序列\ n。\ n'(僅有一段時間的空行)表示「消息結束」。

編輯:是的,存在垃圾郵件發送者的風險!如果$ name實際上包含以下內容:

someonesName 
CC: [email protected]; [email protected] 

(即要注入更多標頭的東西)?

編輯2:沒有注意到「名稱」和「評論」都在消息的正文部分。那麼我對垃圾郵件製造者的想法是無效的。

+0

在那裏添加CC標頭實際上並不會導致電子郵件被傳遞到這些地址,而是使用的信封地址以確定這一點。但是回覆:標題可能會被添加,可能是內容類型:然後是含有病毒的MIME主體......!我認爲你需要檢查名稱和註釋字段是否合適 – jcoder 2010-01-02 22:12:43

+0

@naivists:我只是試過這個,而\ n。\ n似乎並不是問題,我得到了所有三個「測試」行消息:'mail('[email protected]','','test message:test1 \ n。\ ntest2 \ n \ n。\ n \ ntest3「,」From:[email protected]「); ' – Jenni 2010-01-03 02:38:16

+0

也,我想你的意思是「連續」:) – Jenni 2010-01-03 02:40:07

相關問題