HTTP vs HTTPS

探索HTTP和HTTPS之間的主要差異,了解為什麼HTTPS對於一切都更快更好。 HTTP(超文本傳輸協議)是我們所知的網絡的協議基礎。 它位於TCP之上,TCP位於IP之上。 網頁可以使用HTTP或HTTPS(超文本傳輸協議安全版)。 它們有什麼不同?為什麼現在Chrome將HTTP標記為不安全呢? 安全性 當您從服務器請求一個HTTP頁面時,數據會通過許多不同的網絡,每個網絡都由一個單獨的公司或實體控制。 從WiFi路由器開始,可能是咖啡店擁有的,也可能是城市公共網絡基礎設施擁有的,網絡中的每個節點都可以看到請求和響應,並以任何方式修改它。 它們可能會注入廣告,可能會注入惡意軟件,可能會記錄您輸入的任何憑據。中間的服務器可以充當中間人,發送被破壞的信息。 這也適用於任何未安全的Internet協議。 HTTPS流量是端到端加密的,這意味著在您和網絡另一端的服務器之間交換的信息中間沒有任何人可以閱讀。 端口 默認情況下,HTTP使用端口80提供服務,而HTTPS使用端口443提供服務。這些是默認端口,但Web服務器可以選擇在不同的隨機端口上提供內容,此時您需要在地址欄中指定: http://flaviocopes.com http://flaviocopes.com:80/javascript https://flaviocopes.com:8081/javascript HTTPS速度慢嗎? 不是!相反地。 有一個關於頁面速度的神話。人們認為為了HTTPS所需要的TLS握手會使頁面速度變慢,但實際上,HTTPS頁面可以比HTTP頁面加載得更快。 為什麼?因為有了HTTP/2,HTTP協議的最新版本。HTTP/2可以並行提供請求,並要求建立安全連接,因此,如果您的服務器使用支持HTTP/2的現代Web服務器,那麼使用HTTPS時,您的網頁將會有顯著的速度提升。 HTTP/2引入了更好的並行處理、多路複用和壓縮,這是HTTP的一個很好的更新。 請參閱以下網頁的示例:<https://www.httpvshttps.com/>和<https://www.troyhunt.com/i-wanna-go-fast-https-massive-speed-advantage/> HTTPS是否會影響SEO? 是的。 特別是,Google表示,HTTPS在SEO方面會給您帶來優勢。 此外,Google將會在其Chrome瀏覽器中正式將HTTP網站標記為不安全,這清楚地表明,如果您關心Google的需求並且想利用這一點,您應該盡快切換到HTTPS。最好的時間應該是3年前,下一個最好的時間就是今天。 實施HTTPS是否困難? 一點也不。由於Let’s Encrypt提供免費的SSL證書,對HTTPS的推動產生了巨大的影響,現在每個體面的託管提供商都免費為所有帳戶實施它。多虧了這一點,在2018年HTTPS連接比HTTP連接更多。 在過去,對於一個普通網站來說,獲得SSL證書是一個高級選項,只有少數人願意為之支付費用,因為該網站不會賺錢或者不處理用戶數據。 如今已經沒有任何藉口了。

JSONP 指南

JSONP 是從第三方服務器加載數據的一種方式,可以繞過同源策略。 默認情況下,你無法從不是當前域名和端口的地方加載 JSON 文件並在應用程序中使用它。 你可能將應用程序從 localhost:8080 服務,但API是由另一個運行在 localhost:2001 上的Node.js應用程序提供的。 或者你可能希望在瀏覽器中訪問一些以JSON格式提供的公共API。 使用API是一個常見需求,在瀏覽器中,由於安全原因,由於同源策略,默認情況下必須禁止這種行為,以防止可能的問題。 JSONP 在 CORS 存在之前誕生。如今,CORS 是一種更(也是唯一一種?)明智的方法來解決這個問題,但你也需要了解 JSONP,因為它可能在你的情況下更好。此外,自 JSONP 誕生以來,一些安全問題已被發現,所以你需要了解使用 JSONP 的所有 安全問題。 JSONP 僅支持 GET HTTP 方法,因此它比CORS要不那麼強大。 它是如何工作的 服務器必須支持 JSONP,例如 Express 中可以使用 Response.jsonp() 方法,它類似於 Response.json() ,但處理 JSONP 回調: res.jsonp({ username: 'Flavio' }) 在客戶端,你可以加載指定了回調函數的端點: <script src="http://localhost:2001/api.json?callback=theCallbackFunction"></script> 回調函數必須是全局的,它將接收 JSON 數據: const theCallbackFunction = (data) => { console.log(data) } jQuery 通過在其 ajax() 方法中封裝 JSONP,簡化了此方法: $.ajax({ url: 'http://localhost:2001/api.json', dataType: 'jsonp', success: (data) => { console....

什麼是CDN?

了解什麼是CDN以及它的用途 CDN代表內容交付網絡。 它是一組分佈在全球各地並相互連接的伺服器。 在幫助加快網站速度的背景下,它們的工作是分發資源(例如圖像、JavaScript文件、CSS和HTML),以便這些資源可以物理上靠近每個可能想要訪問您網站的用戶,從而改善連接速度並減少延遲。 CDN是最終的快取網絡,也是以最便宜的方式在全球範圍內提供內容。 訪問者將永遠不會訪問存放您文件的實際網絡伺服器,而是會訪問這些CDN伺服器,從而減少負載。 CDN提供: 速度,靠近用戶網絡可以提高速度並減少延遲 冗餘性,如果CDN的某個節點失效,其他節點可以處理流量 與從集中位置提供所有流量相比,帶寬和伺服器功率消耗較低的成本 在CDN節點級別增加額外的保護層的安全性。並非所有CDN都這樣做,但大多數CDN都這樣做,並且還引入了DDoS攻擊保護措施。 CDN從源伺服器獲取原始資源,並且只要源資源沒有更改,它將繼續提供其資源的本地副本。 每個CDN伺服器位於不同的大陸,並且根據CDN的建立方式,在大陸的不同地區也有分佈。 每家大型公司都使用CDN來提供資源,您也可以透過利用像Cloudflare、Amazon CloudFront、Google Cloud CDN、Azure CDN等公司的服務來使用CDN。 CDN也可以直接由您的網站主機集成。例如,我使用的是Netlify,他們集成了自動CDN,使我的網站在世界各地的每個位置都運行快速。

如何使用JavaScript的bcrypt庫

了解如何使用bcrypt庫在JavaScript中加密和驗證密碼 bcrypt是JavaScript中最常用的用於處理密碼的npm包之一。 這是基本的安全知識,但對於新手開發人員來說值得一提:您永遠不應該以明文形式在數據庫或其他地方存儲密碼。絕對不行。 相反,您需要從密碼中生成一個哈希值,然後將其存儲。 使用方法如下: import bcrypt from 'bcrypt' // 或 // const bcrypt = require('bcrypt') const password = 'oe3im3io2r3o2' const rounds = 10 bcrypt.hash(password, rounds, (err, hash) => { if (err) { console.error(err) return } console.log(hash) }) 您需要將一個數字作為第二個參數傳遞,該數字越大,哈希值就越安全,但生成的時間也越長。 該庫的README文件告訴我們,在2GHz核心上,我們可以生成: rounds=8 : ~40 hashes/sec rounds=9 : ~20 hashes/sec rounds=10: ~10 hashes/sec rounds=11: ~5 hashes/sec rounds=12: 2-3 hashes/sec rounds=13: ~1 sec/hash rounds=14: ~1.5 sec/hash rounds=15: ~3 sec/hash rounds=25: ~1 hour/hash rounds=31: 2-3 days/hash 如果您多次運行bcrypt....

如何將密碼存儲在資料庫中

你不需要將密碼直接存儲在資料庫中。你需要存儲密碼的雜湊值,這是從密碼產生的一個字符串,但沒有辦法從雜湊值回推出原始的密碼值。 使用Node,安裝 bcrypt: npm install bcrypt 引入它,並設置salt回合值,稍後我們會使用它: const bcrypt = require('bcrypt') const saltRounds = 10 創建密碼雜湊值 使用下面的代碼創建密碼雜湊值: const hash = await bcrypt.hash('PASSWORD', saltRounds) 其中 PASSWORD 是實際的密碼字符串。 如果你更喜歡回調函數的方式: bcrypt.hash('PASSWORD', saltRounds, (err, hash) => { }) 然後你可以將 hash 值存儲在資料庫中。 驗證密碼雜湊值 要驗證密碼,需要使用 bcrypt.compare() 將其與存儲在資料庫中的雜湊值進行比較: const result = await bcrypt.compare('PASSWORD', hash) // result 是 true 或 false 使用回調函數的方式: bcrypt.compare('somePassword', hash, (err, result) => { // result 是 true 或 false })