2012-06-26 37 views
2

我想提出一個腳本,在PHP將使用fwrite之前使用fwrite和它的廣告它< /文件>標記後和它沒有得到包括在內。主要目的是記錄這個.htaccess文件中的每個IP,以便無法訪問這個特定的文件。這裏是我的代碼:(搜索大約3+小時在谷歌& php.net)。我曾經想過,如果有一種方法可以從文件.htaccess中讀取「word」</file>,並且在添加$ ip之前。或者一些其他的方式來獲得<文件forum.php *裏面的$ badpersonip(所以它需要從PHP和單獨的.htaccess做我不能使用數據庫)如何特定標籤</file>

<?php 

$badpersonip = $_SERVER['REMOTE_ADDR']; 

echo "You have been banned $badpersonip , dont spam!! <br> "; 
$ip = "deny from $badpersonip \n"; 
$banip = '.htaccess'; 
$fp = fopen($banip, "a"); 
$write = fputs($fp, $ip); 

?> 

而且,這裏是我的。 htaccess代碼:

<files forum.php> 
Order Allow,Deny 
Allow from all 

deny from 127.0.2.1 
deny from 127.1.2.1 

</files> 
deny from 127.0.0.3 

正如您所看到的那樣,廣告新IP,但在文件標籤已關閉後的底部。 :(

謝謝你的幫助非常感激。

回答

3

如果不是使用fwrite()你讀了整個事情與file_get_contents()一個字符串,你可以很容易做到str_replace()新線和</files>替換現有</files>

// Read the while file into a string $htaccess 
$htaccess = file_get_contents('.htaccess'); 
// Stick the new IP just before the closing </files> 
$new_htaccess = str_replace('</files>', "deny from $badpersonip\n</files>", $htaccess); 
// And write the new string back to the file 
file_put_contents('.htaccess', $new_htaccess); 

這是不推薦,如果你希望文件變得非常大,但是對於幾十或幾百個IP地址,應該很好地工作。因爲是如果你有一個以上的這不完全正常工作</files> i ñ.htaccess文件。這需要更仔細的解析才能找到正確的結束標記。

如果保留空格(如果您在</files>之前有縮進)對您很重要,那麼請使用preg_replace()來代替更簡單的str_replace()

此另一種方法將是使用file()讀取的.htaccess到其線的陣列,找到包含</files>的行,並插入一個新的數組元素之前它再加入線回到一起,並將其寫入到文件。

+0

非常感謝你只是試着編輯腳本,它只給我新的部分,並刪除了前一部分。輸出是: 從127.0.0.1拒絕 爲什麼它不加入.htaccess與$ new_htaccess?相反,它僅在.htaccess中輸出$ new_htaccess。 我仍然在PHP的「初學者」,所以我不想複雜的事情太多那裏不會被許多IP禁止。我還沒有得到數組。 – MagicHown

+0

@MagicHown對不起,我有str_replace()錯誤順序的參數。再試一次......原來的字符串主題最後不是第一個。 –

+0

非常非常感謝你Michael,它完美的工作!如果日誌變大,我會記住日誌的清除。你會在這個文件中看到任何安全問題嗎?如果有人欺騙他們的IP讓我們說googlebot的,並讓他們自己被禁止,如果我已經在允許部分添加了IP會拒絕它會得到後來刪除以前的允許?我將嘗試以後創建一個MySQL數據庫設置規則的IP!=給Googlebot和其他已知的bots.But比「谷歌」等當前時間禁止履帶式的問題,我沒有看到任何東西是嗎?三江源 – MagicHown