2016-03-01 501 views
2

我試圖通過我在c中編寫的應用程序上載文件。 因爲我沒有找到任何API,我決定通過命令。 輸入命令行看起來像這樣。當特殊字符存在於密碼中時,ftp文件上傳失敗

ftp -u ftp://ftpuser:[email protected]@x.x.x.x/test.txt /tmp/test.txt 

無論何時存在特殊字符,登錄都將失敗。當我嘗試與不同的用戶沒有任何特殊字符的密碼上傳作品。

如何解決此問題或者是否有其他方法可用,如API哪些可以使用。

如果有任何示例代碼可用,那麼它將有很大的幫助。

特殊字符意味着@$#(例:[email protected]password$123

代碼片段:

RunCommandWithPipe(PSTRING CmdLine) 
{ 
    FILE *fp; 
    int status; 


    fp = popen(CmdLine, "r"); 
    if (fp == NULL) 
    { 
      ErrGen(constErrOpenFile); 
    } 

    status = pclose(fp); 
    if (status == -1) 
    { 
      ErrGen(constErrCloseFile); 
    } 
} 
+0

請包括相關的代碼。你如何調用命令?系統? popen方法?什麼是特殊字符?他們有什麼特別之處?它們對殼是特別的嗎?它們是否包含空字節的Unicode字符?另外,這個例子的ftp命令是否正確?爲什麼那裏有兩個@符號?密碼應該是「密碼@ 123」嗎? –

+0

是密碼是「密碼@ 123」。是上面的例子是格式ftp -u ftp://用戶名:密碼@主機/路徑「源位置」。我嘗試通過終端手動,它的工作時,沒有特殊字符出現在密碼 – Darshan

回答

0

您propably使用錯誤的字符集發送密碼

+2

這是一個評論,而不是一個答案 –

2

之所以這不起作用是因爲您將未過濾的元字符傳遞到shell。這非常危險。如果某個不值得信任的人能夠決定ftp命令的任何參數的值,例如用戶名,密碼,ftp服務器或文件名,那麼這個人就可以運行任意的shell命令。

你可以看到在你的ftp命令前發生了什麼事情通過將「回聲」:

echo ftp -u ftp://ftpuser:[email protected]/test.txt /tmp/test.txt 

你會得到這樣的結果:

ftp -u ftp://ftpuser:[email protected]/test.txt /tmp/test.txt 

外殼正試圖評估$ 1作爲變量,留下空的結果。

有幾件事你可以做。

1)通過轉義所有元字符使命令安全。在這裏,你需要非常小心,使用白名單的方法,而不是試圖擺脫你想到的特殊字符。在白名單方法中,您接受某些字符集是安全的,例如[A-Za-z0-9:_-]。通過在反斜槓前加上其他字符,可以將其刪除或退出。 (例如,「foo:bar $ baz & abc」變成「foo:bar \ $ bazabc」)如果你這樣做,不要試圖去想你所知道的那些特殊的字符並逃避它們。你很可能會忘記一些,並沒有處理輸入此類似:對popen方法管

ftp -u ftp://ftpuser:; rm -rf /;echo @x.x.x.x/test.txt /tmp/test.txt 

2)不要通過FREAD傳遞參數的外殼,而不是控制FTP客戶端()/ FWRITE() () 給你。

在這種情況下,你所做的就是啓動ftp客戶端而不帶參數。然後你寫「OPEN 192.168.1.1」或你想連接的任何地方。然後你寫用戶名。然後你寫密碼。然後你編寫GET或PUT命令。然後你寫「退出」或寫一個EOF。您應該從服務器讀取結果代碼。成功獲得200個系列成果。如果登錄信息不好,您將得到500系列的結果等。

當您輸入FTP命令時,您仍然需要注意,因爲它會使用像「!rm -rf /」這樣的shell轉義,但是比shell更少的機會。你只需要確保你建立你的FTP命令的字符串是一行,並且你總是在它們之前用一個有效的FTP命令。你還應該留意任何有不可信賴的文件名的有趣業務。 (例如,不允許絕對路徑,「..」等等)

+0

嗨我試過你的建議,但我遇到了問題之間1.「裁談會」命令沒有工作登錄遠程機器目錄,總是給了500錯誤說錯了命令後,如此多的搜索我發現「CWD」它像魅力工作,然後改變目錄在本地機器上我用「液晶顯示器」,這是現在不工作,我無法移動到下一步(PUT)命令是因爲這個問題。請讓我知道,如果有任何解決方案可用於此。 – Darshan

+0

在我的回答中,我不小心大寫了FTP命令。在控制通道上發送的命令全部大寫,但是您寫入的ftp(1)客戶端的命令不是。我的錯。你可以做這樣的事情:get remotename.txt /tmp/localname.txt –

相關問題