在 Express 中使用 express-validator 进行输入消毒

您已经了解了如何验证从外部世界进入 Express 应用程序的输入。 当您运行面向公众的服务器时,您会很快明白一件事:永远不要相信输入。 即使您使用客户端代码对输入进行了消毒和确保人们无法输入奇怪的东西,您仍然可能受到人们使用工具(甚至仅仅是浏览器开发工具)直接POST到您的端点的影响。 或者机器人尝试使用人类已知的每种攻击方式的组合。 您需要做的是对输入进行消毒。 您已经使用的express-validator包 也可以方便地用于执行消毒操作。 假设您有一个POST端点接受name、email和age参数: const express = require('express') const app = express() app.use(express.json()) app.post('/form', (req, res) => { const name = req.body.name const email = req.body.email const age = req.body.age }) 您可以使用以下方式进行验证: const express = require('express') const app = express() app.use(express.json()) app.post('/form', [ check('name').isLength({ min: 3 }), check('email').isEmail(), check('age').isNumeric() ], (req, res) => { const name = req.body.name const email = req.body.email const age = req....

在 Express 中處理 CORS

如何透過設定 CORS 允許跨網站請求 通常在瀏覽器中運行的 JavaScript 應用程式只能存取由同一個網域(原始網站)提供的 HTTP 資源。 從相同來源載入圖片、腳本/樣式表一直是可行的。使用 @font-face 載入網頁字型時也已經有預設的「同源政策」。而其他較不常見的事物(例如 WebGL 紋理和 Canvas API 中載入的 drawImage 資源)也是如此。 然而,對於從外部第三方伺服器發送的 XHR 和 Fetch 請求,預設會失敗。這就是除非第三方伺服器實現了一個允許建立連線以及請求資源並下載和使用的機制。 這個機制被稱為 CORS 跨來源資源共用。 需要 CORS 的一件非常重要的事情是 ES 模組,最近在現代瀏覽器中引入了。 如果您沒有在伺服器端設置允許提供第三方來源的 CORS 政策,請求將會失敗。 Fetch 範例: XHR 範例: 跨來源資源失敗的條件如下: 不同網域 不同子網域 不同埠號 不同協定 CORS 的目的是為了保護您的安全,防止惡意使用者利用您正在使用的 Web 平台。 如果您同時控制了伺服器和客戶端,您會知道雙方都是可信任的,因此有充分的理由允許資源共用。 如何做到這點呢? 答案取決於您使用的伺服器端堆棧。 瀏覽器支援 相當不錯(基本上所有,除了 IE<10): Express 範例 如果您正在使用 Node.js 和 Express 作為框架,請使用 CORS 中介軟體套件。 這裡有一個簡單的 Express Node.js 伺服器範例: const express = require('express') const app = express() app....

在 Express 中處理 HTTP 標頭

學習如何使用 Express 存取和更改 HTTP 標頭 從請求中存取 HTTP 標頭值 您可以使用 Request.headers 屬性存取所有的 HTTP 標頭: app.get('/', (req, res) => { console.log(req.headers) }) 使用 Request.header() 方法來存取個別請求標頭的值: app.get('/', (req, res) => { req.header('User-Agent') }) 更改回應的任何 HTTP 標頭值 您可以使用 Response.set() 來更改任何 HTTP 標頭的值: res.set('Content-Type', 'text/html') 然而,Content-Type 標頭有一個捷徑: res.type('.html') // => 'text/html' res.type('html') // => 'text/html' res.type('json') // => 'application/json' res.type('application/json') // => 'application/json' res.type('png') // => image/png:

在 Express 中設置 Let's Encrypt

如何使用流行的免費解決方案 Let’s Encrypt 設置 HTTPS 如果你在自己的 VPS 上運行 Node.js 應用程式,你需要一個獲取 SSL 憑證的解決方案。 使用 Let’s Encrypt 和 Certbot 是當今的標準做法,它們是由 EFF(Electronic Frontier Foundation)提供的工具。EFF 是一家致力於保護隱私、自由言論和整個數位世界公民權利的領先非盈利組織。 我們將按照以下步驟進行: 安裝 Certbot 使用 Certbot 生成 SSL 憑證 允許 Express 提供靜態文件 確認域名 獲取憑證 設置續訂 安裝 Certbot 以下指令假設你使用 Ubuntu、Debian 或任何其他使用 apt-get 來管理套件的 Linux 發行版: sudo add-apt-repository ppa:certbot/certbot sudo apt-get update sudo apt-get install certbot 你也可以在 Mac 上安裝 Certbot 進行測試(需要 Homebrew): brew install certbot 然而,你需要將其連接到一個真實的域名,以便它有用。 使用 Certbot 生成 SSL 憑證 現在 Certbot 已安裝完成,你可以使用它來生成憑證。你必須以 root 身份運行此命令:...

在 Go 中的方法

在 Go 中,一個函數可以被賦值給結構體,這種情況下我們稱之為方法。 舉個例子: type Person struct { Name string Age int } func (p Person) Speak() { fmt.Println("Hello from " + p.Name) } func main() { flavio := Person{Age: 39, Name: "Flavio"} flavio.Speak() } 方法可以聲明為指針接收者或值接收者。 上面的例子展示了一個值接收者,它接收結構體實例的副本。 下面是一個指針接收者,它接收結構體實例的指針: func (p *Person) Speak() { fmt.Println("Hello from " + p.Name) }

在 Go 中的條件語句

我們使用 if 陳述式來根據條件執行不同的指令: if age < 18 { // 未成年 } else 部分是可選的: if age < 18 { // 未成年 } else { // 成年 } 並且可以與其他的 if 陳述式結合使用: if age < 12 { // 兒童 } else if age < 18 { // 青少年 } else { // 成年人 } 如果你在 if 內部定義任何變數,它只在 if 內部可見(同樣適用於 else 以及在任何使用 {} 開啟新區塊的地方) 如果你將有許多不同的 if 陳述式來檢查單個條件,最好使用 switch: switch age { case 0: fmt.Println("零歲") case 1: fmt....

在 HTML 中保留空格和換行

在一個專案中,我使用 <textarea> 欄位在表單中獲取工作的描述,然後將其存儲在數據庫中。 現在,這個描述並沒有被解釋為 HTML,當我將它添加到頁面中時,瀏覽器並沒有尊重空格和換行。 我希望獲得這樣的顯示效果: 但我得到了這樣的顯示效果: 解決方法是添加以下 CSS 屬性: white-space: pre-wrap; 在 Tailwind 中,對應的類名為 whitespace-pre-wrap。

在 Hugo 中嵌入 HTML 到 Markdown

在最長的一段時間後,我從 Blackfriday 切換到默認的 Hugo Markdown 渲染器 Goldmark。我延遲了這個切換的時間,但在版本 0.100 中,他們移除了被棄用的舊版 Markdown 渲染器。 不幸的是,這意味著我在 Markdown 中嵌入的所有 HTML 都停止運作。 我通過在我的 config.yaml 文件中啟用這個選項來解決這個問題: markup: goldmark: renderer: unsafe: true 或者,在 config.toml 文件中: [markup.goldmark.renderer] unsafe = true

在 iOS 上使用 WebRTC 出現黑盒子時該怎麼辦

最近我在使用 WebRTC 搭配 PeerJS 庫進行一個項目。在桌面端一切運作正常,但在 iOS Safari 上,無論是本地流還是遠端流,都只看到一個黑色盒子。 經過一番研究後,我找到了解決方法,需要將 video 標籤的 playsincline 屬性添加到本地和遠端流的標籤中: <video id="local" autoplay playsinline muted></video> <video id="remote" autoplay playsinline></video> (注意:在 JSX 中是 playsInline) 解決這個問題後,我成功在 iOS 上正常顯示了 WebRTC 的視頻流。希望這個方法也能對你有幫助!

在 JavaScript 中用 slugify 給字符串添加斜線字尾

在這個技術博客中,我們將學習如何在 JavaScript 中使用 slugify 函數給字符串添加斜線字尾。 首先,你需要安裝 slugify 函數庫: npm i slugify 然後導入它: import slugify from 'slugify' 你可以這麼做: const slug = slugify('Testing this') console.log(slug) //testing-this 請注意,如果該字符串中包含點或其他標點符號,slugify 函數不會刪除它們。 如果需要刪除這些標點符號,你可以使用正則表達式,像這樣: slugify('Testing. this!', { remove: /[\*+~.,()'"!:@]/g })