2012-11-13 48 views
1

在正常情況下,一切正常,我可以用fopen()fwrite()編寫和創建新文件,但在「重度」DDOS攻擊下,當文件指針位於0 ,我不能寫任何東西file.eg.使用「w」mod,結果將是一個空白文件,但通過使用「a」或「c」mod,如果文件不存在或爲空,則不會寫入任何內容(也只是創建一個空白文件)有一些字符,它會寫入字符或分別清除和重寫新字符。 當DDOS停止時,一切都會好的。 這裏是我用於測試的簡單代碼,這是什麼問題?我可以修復它嗎?在重度ddos攻擊下php fopen()和fwrite()

我使用的是與Apache和lighttpd的Ubuntu的PHP5 ...

<?php 
$fp = fopen('data.txt', 'w'); 
fwrite($fp, '1'); 
fputs($fp, '23'); 
fclose($fp); 
?> 
+0

什麼樣的DOS攻擊?什麼是DOS攻擊Web服務器服務器或此腳本(氾濫)? – Baba

+0

@Baba,大約700-800 ips,每20秒發送一個get到一個php文件,但不是那個測試腳本。 – sorset

+0

你確定這些IP是唯一的,他們不使用隨機代理....因爲它可以很容易被阻止....如果你的系統超過處理或內存......它很難做任何事 – Baba

回答

1

我明白這個問題的辦法是,你必須運行此代碼問題,當有多個請求訪問PHP文件(因此您正在寫入的文件)。

現在,雖然它遠非萬無一失,flock()是有幫助的。基本概念是,你要求的文件的鎖在寫之前且僅當你能夠獲得鎖該文件寫入文件,就像

$fp = fopen($filename,"w"); // open it for WRITING ("w") 
if (flock($fp, LOCK_EX | LOCK_NB)) { 
    // do your file writes here 

    // when you're done, 
    // flush your file writes to a file before unlocking 
    fflush($fp); 
    // unlock the file 
    flock($fp, LOCK_UN); 
} else { 
    // flock() returned false, no lock obtained 
    print "Could not lock $filename!\n"; 
} 
fclose($fp); 

你可以閱讀一些更多的細節來自manual entrythis article

+0

謝謝。但攻擊是在其他.php腳本,即使在另一個虛擬主機!順便說一句,我會試着等待下一次攻擊來測試你的解決方案... – sorset

+0

如果他們在其他虛擬主機上,那麼你可能不會用它來做很多事情。它應該由託管提供商來尋找解決方案。 – eis

+0

但是,沒有託管服務提供商......我在VMware虛擬機下使用Ubuntu。由於DDos,主服務器很忙,我在另一個虛擬主機上使用了測試腳本... – sorset