免受黑客攻擊的9個(gè)技巧

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

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

      黑客經(jīng)常通過編寫用于搜索互聯(lián)網(wǎng)的自動(dòng)化腳本執(zhí)行,以試圖利用軟件中已知的網(wǎng)站安全問題。以下是我們的九大技巧,可幫助您和您的網(wǎng)站安全上網(wǎng)。

      01.保持軟件最新

      這似乎很明顯,但確保您使所有軟件保持最新對于確保您的網(wǎng)站安全至關(guān)重要。這適用于服務(wù)器操作系統(tǒng)和您可能在您的網(wǎng)站上運(yùn)行的任何軟件,例如 CMS 或論壇。當(dāng)在軟件中發(fā)現(xiàn)網(wǎng)站安全漏洞時(shí),黑客會(huì)迅速嘗試濫用它們。

      如果您使用的是托管托管解決方案,那么您不必太擔(dān)心為操作系統(tǒng)應(yīng)用安全更新,因?yàn)橥泄芄緫?yīng)該負(fù)責(zé)這一點(diǎn)。

      如果您在您的網(wǎng)站上使用第三方軟件,例如 CMS 或論壇,您應(yīng)該確保快速應(yīng)用任何安全補(bǔ)丁。大多數(shù)供應(yīng)商都有一個(gè)郵件列表或 RSS 提要,詳細(xì)說明任何網(wǎng)站安全問題。WordPress、Umbraco 和許多其他 CMS 在您登錄時(shí)會(huì)通知您可用的系統(tǒng)更新。

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

      02.注意SQL注入

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

      考慮這個(gè)查詢:

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

      如果攻擊者更改 URL 參數(shù)以傳入 ' 或 '1'='1 這將導(dǎo)致查詢?nèi)缦滤荆?/p>

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

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

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

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

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

      03.防止XSS攻擊

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

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

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

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

      04. 當(dāng)心錯(cuò)誤信息

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

      05. 雙向驗(yàn)證

      驗(yàn)證應(yīng)始終在瀏覽器和服務(wù)器端進(jìn)行。瀏覽器可以捕獲簡單的故障,例如空的必填字段以及在僅數(shù)字字段中輸入文本時(shí)。然而,這些可以被繞過,您應(yīng)該確保檢查這些驗(yàn)證和更深入的驗(yàn)證服務(wù)器端,因?yàn)椴贿@樣做可能會(huì)導(dǎo)致惡意代碼或腳本代碼被插入到數(shù)據(jù)庫中,或者可能導(dǎo)致您的網(wǎng)站出現(xiàn)不良結(jié)果。

      06.檢查您的密碼

      每個(gè)人都知道他們應(yīng)該使用復(fù)雜的密碼,但這并不意味著他們總是這樣做。對您的服務(wù)器和網(wǎng)站管理區(qū)域使用強(qiáng)密碼至關(guān)重要,但同樣重要的是堅(jiān)持為您的用戶提供良好的密碼實(shí)踐以保護(hù)其帳戶的安全。

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

      密碼應(yīng)始終存儲(chǔ)為加密值,最好使用單向散列算法,例如 SHA。使用這種方法意味著當(dāng)您對用戶進(jìn)行身份驗(yàn)證時(shí),您只需要比較加密的值。為了獲得額外的網(wǎng)站安全性,最好對密碼進(jìn)行加鹽,每個(gè)密碼使用一個(gè)新的加鹽。

      如果有人入侵并竊取您的密碼,使用散列密碼可能有助于破壞限制,因?yàn)闊o法解密它們。有人能做的最好的事情是字典攻擊或蠻力攻擊,基本上是猜測每個(gè)組合,直到找到匹配項(xiàng)。使用加鹽密碼時(shí),破解大量密碼的過程甚至更慢,因?yàn)槊總€(gè)猜測都必須針對每個(gè)加鹽密碼單獨(dú)進(jìn)行散列,這在計(jì)算上非常昂貴。

      值得慶幸的是,許多 CMS 提供了開箱即用的用戶管理,并內(nèi)置了許多這些網(wǎng)站安全功能,盡管可能需要一些配置或額外的模塊才能使用加鹽密碼(Drupal 7 之前)或設(shè)置最小密碼強(qiáng)度。如果您使用的是 .NET,那么值得使用會(huì)員提供程序,因?yàn)樗鼈兎浅?膳渲茫峁﹥?nèi)置的網(wǎng)站安全性并包括用于登錄和密碼重置的現(xiàn)成控件。

      07.避免文件上傳

      允許用戶將文件上傳到您的網(wǎng)站可能是一個(gè)很大的網(wǎng)站安全風(fēng)險(xiǎn),即使只是為了更改他們的頭像。風(fēng)險(xiǎn)在于,任何上傳的文件,無論看起來多么無辜,都可能包含一個(gè)腳本,當(dāng)在您的服務(wù)器上執(zhí)行時(shí),該腳本會(huì)完全打開您的網(wǎng)站。

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

      那么你能做些什么來防止這種情況發(fā)生呢?最終,您希望阻止用戶執(zhí)行他們上傳的任何文件。默認(rèn)情況下,Web 服務(wù)器不會(huì)嘗試執(zhí)行帶有圖像擴(kuò)展名的文件,但不要僅僅依靠檢查文件擴(kuò)展名,因?yàn)橐阎Q為 image.jpg.php 的文件可以通過。

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

      deny from all

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

      order deny,allow

      allow from all

      </Files>

      最終,推薦的解決方案是完全阻止直接訪問上傳的文件。這樣,上傳到您網(wǎng)站的任何文件都存儲(chǔ)在 webroot 之外的文件夾中或作為 blob 存儲(chǔ)在數(shù)據(jù)庫中。如果您的文件不能直接訪問,您將需要?jiǎng)?chuàng)建一個(gè)腳本來從私有文件夾(或 .NET 中的 HTTP 處理程序)中獲取文件并將它們傳送到瀏覽器。圖片標(biāo)簽支持不是圖片的直接 URL 的 src 屬性,因此如果您在 HTTP 標(biāo)頭中設(shè)置正確的內(nèi)容類型,您的 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);

      ?>

      大多數(shù)托管服務(wù)提供商會(huì)為您處理服務(wù)器配置,但如果您在自己的服務(wù)器上托管您的網(wǎng)站,那么您需要檢查的事項(xiàng)很少。

      確保您已設(shè)置防火墻,并阻止所有非必要端口。如果可能的話,設(shè)置一個(gè) DMZ(非軍事區(qū)),只允許外界訪問端口 80 和 443。盡管如果您無法從內(nèi)部網(wǎng)絡(luò)訪問服務(wù)器,這可能是不可能的,因?yàn)槟枰蜷_端口以允許上傳文件并通過 SSH 或 RDP 遠(yuǎn)程登錄到您的服務(wù)器。

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

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

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

      08.使用HTTPSHTTPS

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

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

      這不再像以前那樣棘手或昂貴。Let's Encrypt提供完全免費(fèi)和自動(dòng)化的證書,您需要啟用 HTTPS,并且現(xiàn)有的社區(qū)工具可用于各種常見平臺(tái)和框架來自動(dòng)為您設(shè)置。

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

      已經(jīng)在各處使用 HTTPS?進(jìn)一步了解如何設(shè)置 HTTP 嚴(yán)格傳輸安全 (HSTS),這是一個(gè)簡單的標(biāo)頭,您可以將其添加到服務(wù)器響應(yīng)中,以禁止整個(gè)域的不安全 HTTP。

      09. 獲取網(wǎng)站安全工具

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

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

      一些值得一看的免費(fèi)工具:

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

      自動(dòng)化測試的結(jié)果可能令人生畏,因?yàn)樗鼈兇嬖诖罅繚撛趩栴}。重要的是首先關(guān)注關(guān)鍵問題。通常報(bào)告的每個(gè)問題都帶有對潛在漏洞的很好解釋。您可能會(huì)發(fā)現(xiàn)某些中/低級問題對您的站點(diǎn)來說不是問題。

      您可以采取一些進(jìn)一步的步驟來手動(dòng)嘗試通過更改 POST/GET 值來破壞您的站點(diǎn)。調(diào)試代理可以在這里為您提供幫助,因?yàn)樗试S您攔截瀏覽器和服務(wù)器之間的 HTTP 請求的值。一個(gè)名為Fiddler的流行免費(fèi)軟件應(yīng)用程序是一個(gè)很好的起點(diǎn)。

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