免受黑客攻擊的9個技巧

      您可能認為您的網站沒有任何值得被黑客攻擊的地方,但網站一直受到攻擊。大多數網站安全漏洞不是竊取您的數據或弄亂您的網站布局,而是試圖將您的服務器用作垃圾郵件的電子郵件中繼,或設置臨時網絡服務器,通常用于提供非法性質的文件. 濫用受感染機器的其他非常常見的方法包括將您的服務器用作僵尸網絡的一部分,或挖掘比特幣。您甚至可能被勒索軟件攻擊。

      免受黑客攻擊的9個技巧-南華中天

      黑客經常通過編寫用于搜索互聯網的自動化腳本執行,以試圖利用軟件中已知的網站安全問題。以下是我們的九大技巧,可幫助您和您的網站安全上網。

      01.保持軟件最新

      這似乎很明顯,但確保您使所有軟件保持最新對于確保您的網站安全至關重要。這適用于服務器操作系統和您可能在您的網站上運行的任何軟件,例如 CMS 或論壇。當在軟件中發現網站安全漏洞時,黑客會迅速嘗試濫用它們。

      如果您使用的是托管托管解決方案,那么您不必太擔心為操作系統應用安全更新,因為托管公司應該負責這一點。

      如果您在您的網站上使用第三方軟件,例如 CMS 或論壇,您應該確保快速應用任何安全補丁。大多數供應商都有一個郵件列表或 RSS 提要,詳細說明任何網站安全問題。WordPress、Umbraco 和許多其他 CMS 在您登錄時會通知您可用的系統更新。

      許多開發人員使用 Composer、npm 或 RubyGems 等工具來管理他們的軟件依賴項,而出現在您依賴但沒有引起任何注意的包中的安全漏洞是最容易被發現的方法之一。確保您的依賴項保持最新,并使用Gemnasium等工具在您的某個組件中宣布漏洞時獲得自動通知。

      02.注意SQL注入

      SQL 注入攻擊是指攻擊者使用 Web 表單字段或 URL 參數來訪問或操作您的數據庫。當您使用標準 Transact SQL 時,很容易在不知不覺中將惡意代碼插入查詢中,這些代碼可用于更改表、獲取信息和刪除數據。您可以通過始終使用參數化查詢來輕松防止這種情況,大多數網絡語言都具有此功能并且易于實現。

      考慮這個查詢:

      "SELECT * FROM table WHERE column = '" + parameter + "';"

      如果攻擊者更改 URL 參數以傳入 ' 或 '1'='1 這將導致查詢如下所示:

      "SELECT * FROM table WHERE column = '' OR '1'='1';"

      由于“1”等于“1”,這將允許攻擊者在 SQL 語句的末尾添加一個額外的查詢,該語句也將被執行。

      您可以通過顯式參數化它來修復此查詢。例如,如果你在 PHP 中使用 MySQLi,這應該變成:

      $stmt = $pdo->prepare('SELECT * FROM table WHERE column = :value');

      $stmt->execute(array('value' => $parameter));

      03.防止XSS攻擊

      跨站腳本 (XSS) 攻擊將惡意 JavaScript 注入您的頁面,然后在您用戶的瀏覽器中運行,并且可以更改頁面內容或竊取信息以發送回攻擊者。例如,如果您在沒有驗證的情況下在頁面上顯示評論,那么攻擊者可能會提交包含腳本標簽和 JavaScript 的評論,這些評論可以在每個其他用戶的瀏覽器中運行并竊取他們的登錄 cookie,從而允許攻擊控制每個用戶的帳戶查看評論的用戶。您需要確保用戶無法將活動的 JavaScript 內容注入您的頁面。

      這在現代 Web 應用程序中是一個特別關注的問題,其中頁面現在主要由用戶內容構建,并且在許多情況下生成 HTML,然后也由 Angular 和 Ember 等前端框架解釋。這些框架提供了許多 XSS 保護,但是混合服務器和客戶端渲染也創造了新的和更復雜的攻擊途徑:不僅將 JavaScript 注入 HTML 有效,而且您還可以通過插入 Angular 指令或使用 Ember 來注入將運行代碼的內容幫手。

      這里的關鍵是關注您的用戶生成的內容如何超出您期望的范圍并被瀏覽器解釋為您想要的其他內容。這類似于防御 SQL 注入。動態生成 HTML 時,使用顯式地進行您要查找的更改的函數(例如,使用 element.setAttribute 和 element.textContent,它們將被瀏覽器自動轉義,而不是手動設置 element.innerHTML),或使用函數在您的模板工具中自動進行適當的轉義,而不是連接字符串或設置原始 HTML 內容。

      XSS 防御者工具箱中的另一個強大工具是內容安全策略 (CSP)。CSP 是您的服務器可以返回的標頭,它告訴瀏覽器限制在頁面中執行 JavaScript 的方式和內容,例如禁止運行不在您的域中托管的任何腳本、禁止內聯 JavaScript 或禁用 eval()。Mozilla 有一個很好的指南,其中包含一些示例配置。這使得攻擊者的腳本更難工作,即使他們可以將它們放入您的頁面。

      04. 當心錯誤信息

      請注意您在錯誤消息中泄露了多少信息。只向您的用戶提供最少的錯誤,以確保他們不會泄露您服務器上的秘密(例如 API 密鑰或數據庫密碼)。也不要提供完整的異常詳細信息,因為這些可以使 SQL 注入等復雜攻擊變得更加容易。在您的服務器日志中保留詳細的錯誤信息,并僅向用戶顯示他們需要的信息。

      05. 雙向驗證

      驗證應始終在瀏覽器和服務器端進行。瀏覽器可以捕獲簡單的故障,例如空的必填字段以及在僅數字字段中輸入文本時。然而,這些可以被繞過,您應該確保檢查這些驗證和更深入的驗證服務器端,因為不這樣做可能會導致惡意代碼或腳本代碼被插入到數據庫中,或者可能導致您的網站出現不良結果。

      06.檢查您的密碼

      每個人都知道他們應該使用復雜的密碼,但這并不意味著他們總是這樣做。對您的服務器和網站管理區域使用強密碼至關重要,但同樣重要的是堅持為您的用戶提供良好的密碼實踐以保護其帳戶的安全。

      盡管用戶可能不喜歡它,但從長遠來看,強制執行密碼要求(例如至少大約八個字符,包括大寫字母和數字)將有助于保護他們的信息。

      密碼應始終存儲為加密值,最好使用單向散列算法,例如 SHA。使用這種方法意味著當您對用戶進行身份驗證時,您只需要比較加密的值。為了獲得額外的網站安全性,最好對密碼進行加鹽,每個密碼使用一個新的加鹽。

      如果有人入侵并竊取您的密碼,使用散列密碼可能有助于破壞限制,因為無法解密它們。有人能做的最好的事情是字典攻擊或蠻力攻擊,基本上是猜測每個組合,直到找到匹配項。使用加鹽密碼時,破解大量密碼的過程甚至更慢,因為每個猜測都必須針對每個加鹽密碼單獨進行散列,這在計算上非常昂貴。

      值得慶幸的是,許多 CMS 提供了開箱即用的用戶管理,并內置了許多這些網站安全功能,盡管可能需要一些配置或額外的模塊才能使用加鹽密碼(Drupal 7 之前)或設置最小密碼強度。如果您使用的是 .NET,那么值得使用會員提供程序,因為它們非常可配置,提供內置的網站安全性并包括用于登錄和密碼重置的現成控件。

      07.避免文件上傳

      允許用戶將文件上傳到您的網站可能是一個很大的網站安全風險,即使只是為了更改他們的頭像。風險在于,任何上傳的文件,無論看起來多么無辜,都可能包含一個腳本,當在您的服務器上執行時,該腳本會完全打開您的網站。

      如果您有文件上傳表單,那么您需要非常懷疑地對待所有文件。如果您允許用戶上傳圖像,則不能依賴文件擴展名或 mime 類型來驗證文件是圖像,因為這些很容易被偽造。即使打開文件并讀取標題,或者使用函數檢查圖像大小也不是萬無一失的。大多數圖像格式允許存儲可能包含可由服務器執行的 PHP 代碼的注釋部分。

      那么你能做些什么來防止這種情況發生呢?最終,您希望阻止用戶執行他們上傳的任何文件。默認情況下,Web 服務器不會嘗試執行帶有圖像擴展名的文件,但不要僅僅依靠檢查文件擴展名,因為已知名稱為 image.jpg.php 的文件可以通過。

      一些選項是在上傳時重命名文件以確保正確的文件擴展名,或更改文件權限,例如 chmod 0666 使其無法執行。如果使用 *nix,您可以創建一個 .htaccess 文件(見下文),該文件僅允許訪問設置文件,防止前面提到的雙擴展名攻擊。

      deny from all

      <Files ~ "^\w+\.(gif|jpe?g|png)$">

      order deny,allow

      allow from all

      </Files>

      最終,推薦的解決方案是完全阻止直接訪問上傳的文件。這樣,上傳到您網站的任何文件都存儲在 webroot 之外的文件夾中或作為 blob 存儲在數據庫中。如果您的文件不能直接訪問,您將需要創建一個腳本來從私有文件夾(或 .NET 中的 HTTP 處理程序)中獲取文件并將它們傳送到瀏覽器。圖片標簽支持不是圖片的直接 URL 的 src 屬性,因此如果您在 HTTP 標頭中設置正確的內容類型,您的 src 屬性可以指向您的文件傳遞腳本。例如:

      <img src="/imageDelivery.php?id=1234" />

      <?php
      // imageDelivery.php

      // Fetch image filename from database based on $_GET["id"]
      ...

      // Deliver image to browser
      Header('Content-Type: image/gif');
      readfile('images/'.$fileName);

      ?>

      大多數托管服務提供商會為您處理服務器配置,但如果您在自己的服務器上托管您的網站,那么您需要檢查的事項很少。

      確保您已設置防火墻,并阻止所有非必要端口。如果可能的話,設置一個 DMZ(非軍事區),只允許外界訪問端口 80 和 443。盡管如果您無法從內部網絡訪問服務器,這可能是不可能的,因為您需要打開端口以允許上傳文件并通過 SSH 或 RDP 遠程登錄到您的服務器。

      如果您允許從 Internet 上傳文件,請僅使用安全傳輸方法到您的服務器,例如 SFTP 或 SSH。

      如果可能,讓您的數據庫在與 Web 服務器不同的服務器上運行。這樣做意味著無法直接從外部訪問數據庫服務器,只有您的 Web 服務器可以訪問它,從而最大限度地降低數據泄露的風險。

      最后,不要忘記限制對服務器的物理訪問。

      08.使用HTTPSHTTPS

      是一種用于通過 Internet 提供安全性的協議。HTTPS 保證用戶正在與他們期望的服務器交談,并且沒有其他人可以攔截或更改他們在傳輸中看到的內容。

      如果您有任何用戶可能想要私有的東西,強烈建議您只使用 HTTPS 來傳遞它。這當然意味著信用卡和登錄頁面(以及它們提交到的 URL),但通常也更多的是您的網站。例如,登錄表單通常會設置一個 cookie,該 cookie 與登錄用戶向您的站點發出的所有其他請求一起發送,并用于驗證這些請求。竊取此信息的攻擊者將能夠完美地模仿用戶并接管他們的登錄會話。要擊敗此類攻擊,您幾乎總是希望對整個站點使用 HTTPS。

      這不再像以前那樣棘手或昂貴。Let's Encrypt提供完全免費和自動化的證書,您需要啟用 HTTPS,并且現有的社區工具可用于各種常見平臺和框架來自動為您設置。

      值得注意的是,谷歌已經宣布,如果你使用 HTTPS,他們會提升你的搜索排名,這也給 SEO 帶來了好處。不安全的 HTTP 即將淘汰,現在是升級的時候了。

      已經在各處使用 HTTPS?進一步了解如何設置 HTTP 嚴格傳輸安全 (HSTS),這是一個簡單的標頭,您可以將其添加到服務器響應中,以禁止整個域的不安全 HTTP。

      09. 獲取網站安全工具

      一旦你認為你已經做了所有你能做的,那么就該測試你的網站安全性了。最有效的方法是使用一些網站安全工具,通常稱為滲透測試或簡稱滲透測試。

      有許多商業和免費產品可以幫助您。它們的工作原理與腳本黑客類似,因為它們測試所有已知的漏洞并嘗試使用前面提到的一些方法(例如 SQL 注入)來破壞您的站點。

      一些值得一看的免費工具:

      • Netsparker(提供免費社區版和試用版)。適合測試 SQL 注入和 XSS
      • OpenVAS 自稱是最先進的開源安全掃描器。適合測試已知漏洞,目前掃描超過 25,000 個。但它可能很難設置,并且需要安裝僅在 *nix 上運行的 OpenVAS 服務器。OpenVAS在成為閉源商業產品之前是Nessus的一個分支。
      • SecurityHeaders.io(免費在線檢查)。一種快速報告域已啟用并正確配置的上述安全標頭(例如 CSP 和 HSTS)的工具。
      • Xenotix XSS Exploit Framework來自 OWASP(開放式 Web 應用程序安全項目)的工具,其中包含大量 XSS 攻擊示例,您可以運行這些示例來快速確認您的站點的輸入是否在 Chrome、Firefox 和 IE 中易受攻擊。

      自動化測試的結果可能令人生畏,因為它們存在大量潛在問題。重要的是首先關注關鍵問題。通常報告的每個問題都帶有對潛在漏洞的很好解釋。您可能會發現某些中/低級問題對您的站點來說不是問題。

      您可以采取一些進一步的步驟來手動嘗試通過更改 POST/GET 值來破壞您的站點。調試代理可以在這里為您提供幫助,因為它允許您攔截瀏覽器和服務器之間的 HTTP 請求的值。一個名為Fiddler的流行免費軟件應用程序是一個很好的起點。

      那么您應該嘗試更改請求的哪些內容?如果您的頁面應該只對登錄用戶可見,請嘗試更改 URL 參數,例如用戶 ID 或 cookie 值,以嘗試查看其他用戶的詳細信息。另一個值得測試的領域是表單,更改 POST 值以嘗試提交代碼以執行 XSS 或上傳服務器端腳本。