2013-02-15 20 views
5

我認爲黑客(或腳本小子)使用網站代碼庫的泄漏來攻擊我的網站。數據庫中的文章已更改,以便它們包含此html:如何防止<meta http-equiv =「refresh」>攻擊?

<meta http-equiv="refresh" content="0;url=http://example.com"/> 

但我現在不能重寫系統。有什麼策略來防止未來發生這種情況?

我在考慮將管理腳本遷移到允許訪問某些域的子域。或者使用mod_security SecFilterScanPOST並掃描所有包含http-equiv等的post請求,或者只允許來自我的服務器或所有這些請求的發佈請求?

謝謝。

+2

最好的解決方案,清理您的數據。你也可能想要進一步調查,以防他們損害了服務器本身,而不是試圖阻止他們已經完成的事情。 – 2013-02-15 08:33:22

+6

安全性不是外包裝。如果你的核心應用程序有安全漏洞,你需要通過修復這些漏洞來保護它。不要在外面抹灰色的繃帶。 – deceze 2013-02-15 08:34:42

+1

@deceze如此真實,在現實世界中並不總是一種選擇 – Sprague 2013-02-15 08:39:51

回答

3

的第一步,可以調查其中的代碼注入,這可以幫助你找出根本條款是什麼 -

  1. 如果您的網站從數據庫中獲得並注入標籤內容檢索作爲數據庫內容的一部分,可能您的網站存在SQL注入漏洞或其他漏洞,攻擊者可以更改其中的內容。

  2. 如果每個PHP文件中都有這個標籤,那就意味着攻擊者可以訪問你的文件系統。他可以訪問您的FTP或Telnet或任何其他管理控制檯,或者您的網站具有允許攻擊者在網站上修改/創建文件的漏洞。

  3. 您的服務器也有可能存在允許攻擊者進行此類訪問的漏洞。

後確定的根本原因,因此解決它=)

這裏有一些通用的建議,以幫助防止同樣事件再次發生:

  1. 檢查您的網站和服務器通過代碼審查,筆測試或一些自動掃描來修復漏洞,並相應地修復它們。

  2. 立即安裝更新,修補程序和安全補丁。保持更新,更新,更新,更新...

  3. 在文件系統上分配正確的文件夾權限(讀寫,只讀,無訪問權限),並授予用戶必要的權限(min-privilege principle) 。

    • 例如,您可以考慮讓Web服務器用戶只能讀取除上載文件夾以外的所有Web內容文件夾。
    • 配置文件通常不需要Web服務器用戶可寫。通常它們只能由管理員寫入。還要注意不要讓這些文件的內容可以通過網絡服務器訪問(即通過您的網絡服務器的http:// url)。把他們的網頁內容根外直接是一個不錯的主意
    • 把所有上傳的文件夾中的Web內容的根目錄之外也是一個不錯的主意
    • 礦文件的擁有者也是如此,因爲車主可以隨意更改的權限文件。
  4. 使用第三方組件(例如Wordpress/Joomla插件)​​時要格外小心。只有在您信任發行商的情況下才能使僅從主站點下載。請記住保持它們與時俱進。必要時禁用並刪除它們

  5. 限制對管理控制檯和FTP,Telnet,數據庫管理控制檯(例如phpMyAdmin)等服務的訪問權限。爲其分配好的密碼。最好是不要讓除授權任何人它來訪問(例如,使用在防火牆或配置設置IP限制,或隱藏其背後VPN)

    • 其實你應該避免任何明文協議時的密碼(特別是管理員)都傳輸。通常有加密的替代品,例如Telnet - > SSH,FTP - > SFTP/FTP,HTTP/HTTPS。
    • 數據庫端口應該避免從Internet訪問。只有少數情況下你需要這個。配置它在大多數情況下監聽環回接口...
+0

插入HTML到數據庫中與SQL注入有什麼關係?您可以完美保存預先準備好的語句來做到這一點... – 2013-02-15 14:37:40

+0

@circle謝謝你這個長而有用的答案。我會保留它,並把它給我未來的孩子:) 我認爲安全是一個清單問題。就像一個飛行員,你應該檢查一切,而不依賴人的記憶... – fatihpense 2013-02-15 18:52:47

+0

@FrancoisBourgeois是準備好的語句是SQL注入的有效措施。如果數據庫涉及到生成頁面內容,那麼SQL注入並不是將HTML內容插入頁面的唯一方法。也可以使用存儲的XSS或類似的軟件來實現這一點。我在這裏命名SQLi只是因爲蠕蟲在許多CMS中利用已知的SQLi已經非常普遍(例如,Joomla)插入惡意頁面標題。 – circle 2013-02-17 12:26:08

1

這是一個懶惰的解決方案,如果你不想在從db讀取數據的時候逃離你的數據(你應該)。

function escape_deep(&$value) 
{ 
$value = htmlspecialchars($value); 
} 

array_walk_recursive($_GET, 'escape_deep'); 
array_walk_recursive($_POST, 'escape_deep'); 
+0

我一次做不同的事情,所以我從數據庫中讀取時逃脫了我的數據: )謝謝你的回答.. – fatihpense 2013-02-15 18:47:41

2

請參閱OWASP XSSinput validation

不要處理您的輸入 - 您希望數據庫中原始的<meta http-equiv="refresh" content="0;url=http://example.com"/> - 但將其視爲不可信數據,並在輸出時將其撤銷/撤防。

+0

不要清理你的輸入......等等,什麼? – 2013-02-15 11:18:50

+0

@jack:是:http://anuary.com/55/why-input-sanitization-is-evil – 2013-02-15 14:31:05

+0

@FrancoisBourgeois謝謝.. – fatihpense 2013-02-15 18:46:40