在當今的數位環境中,保護 Node.js 應用程式的安全至關重要。從 Netflix 和 Uber 等全球領導者,到建立下一個偉大事物的新創公司,Node.js 為一些要求最苛刻的高效能應用程式提供支援。然而,應用程式中的漏洞可能會導致未經授權的存取、資料外洩和用戶信任的喪失。
本指南將實用的安全實踐與 OWASP Web 安全測試指南 (WSTG) 中的關鍵概念相結合,幫助您強化 Node.js 應用程式。無論您是管理即時操作還是擴展到數百萬用戶,這項全面的資源都將確保您的應用程式保持安全、可靠和彈性。
資訊收集(WSTG-INFO)
資訊收集通常是攻擊者了解有關您的應用程式的更多資訊的第一步。他們收集的資訊越多,就越容易識別和利用漏洞。
典型 Express.js 伺服器設定與指紋辨識
預設情況下,Express.js 包含可能會無意中洩露有關您的伺服器的資訊的設定。一個常見的例子是 X-Powered-By HTTP 標頭,它表明您的應用程式正在使用 Express。
易受攻擊的程式碼範例:
const express = require('express'); const app = express(); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
在此設定中,每個 HTTP 回應都包含 X-Powered-By: Express 標頭。
問題:
- 指紋辨識:攻擊者可以使用此標頭來確定您正在使用的技術。了解您正在執行 Express 後,他們可以針對特定版本的 Express 或 Node.js 中的已知漏洞自訂攻擊。
緩解措施:
停用此標頭以使攻擊者更難識別您的伺服器。
改進的程式碼:
const express = require('express'); const app = express(); // Disable the X-Powered-By header app.disable('x-powered-by'); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
配戴安全帽增強緩解效果:
更好的方法是使用頭盔中間件,它設定各種 HTTP 標頭來提高應用程式的安全性。
const express = require('express'); const helmet = require('helmet'); const app = express(); // Use Helmet to secure headers app.use(helmet()); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
為什麼要戴頭盔?
- 全面的安全標頭: Helmet 設定多個 HTTP 標頭,有助於保護您的應用程式免受眾所周知的 Web 漏洞的影響。
- 易於使用:只需一行程式碼,即可顯著增強應用程式的安全狀況。
配置和部署管理測試 (WSTG-CONF)
設定和部署管理是應用程式安全的關鍵面向。錯誤配置可能為攻擊者敞開大門。
在生產中以開發模式運作
在生產伺服器上以開發模式運行應用程式可能會暴露詳細的錯誤訊息和堆疊追蹤。
易受攻擊的程式碼範例:
const express = require('express'); const app = express(); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
在此設定中,詳細的錯誤訊息將發送至客戶端。
問題:
- 資訊外洩:詳細的錯誤訊息和堆疊追蹤可以洩露有關應用程式結構、依賴項和檔案路徑的敏感資訊。
- 促進利用:攻擊者可以使用此資訊來識別潛在的漏洞並發動有針對性的攻擊。
緩解措施:
將 NODE_ENV 設定為「生產」並在生產中使用通用錯誤訊息。
改進的程式碼:
const express = require('express'); const app = express(); // Disable the X-Powered-By header app.disable('x-powered-by'); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
最佳實務:
- 正確設定環境變數:確保生產環境中的 NODE_ENV 設定為「生產」。
- 內部日誌記錄:內部記錄錯誤以用於偵錯目的,而不會向最終使用者公開詳細資料。
使用預設或弱憑證
使用預設或弱憑證,例如用於簽署 JSON Web 令牌 (JWT) 的簡單金鑰,是一種常見的安全錯誤。
易受攻擊的程式碼範例:
const express = require('express'); const helmet = require('helmet'); const app = express(); // Use Helmet to secure headers app.use(helmet()); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
問題:
- 弱密鑰:使用簡單或常見的字串(如“secret”)使攻擊者很容易猜測或暴力破解密鑰。
- 硬編碼秘密:如果您的程式碼庫遭到破壞,直接在程式碼中儲存秘密會增加暴露的風險。
- 令牌偽造:知道您金鑰的攻擊者可以偽造有效的 JWT,從而獲得未經授權的存取。
緩解措施:
使用強大、安全的金鑰並安全儲存。
改進的程式碼:
// app.js const express = require('express'); const app = express(); // Error handling middleware app.use((err, req, res, next) => { res.status(500).send(err.stack); // Sends stack trace to the client }); // Your routes here app.listen(3000);
最佳實務:
- 環境變數: 不要將機密提交給版本控制。使用未簽入原始程式碼管理的環境變數或設定檔。
- 輪替秘密:實施定期輪替秘密的流程。
- 驗證配置:確保在應用程式啟動期間設定所有必需的環境變數。
身分識別管理測試 (WSTG-IDNT)
身分管理對於保護使用者帳戶和防止未經授權的存取至關重要。
薄弱的使用者名稱策略和帳號枚舉
允許弱用戶名並提供特定的錯誤訊息可能會導致帳戶枚舉攻擊。
易受攻擊的程式碼範例:
const express = require('express'); const app = express(); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
問題:
- 弱用戶名:允許簡短的使用者名稱會增加帳戶外洩的風險。
- 帳號列舉:特定的錯誤訊息可以幫助攻擊者確定有效的使用者名稱。
緩解措施:
實作使用者名稱驗證並使用通用錯誤訊息。
改進的程式碼:
const express = require('express'); const app = express(); // Disable the X-Powered-By header app.disable('x-powered-by'); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
說明:
- 使用者名稱驗證:確保使用者名稱符合特定標準,並減少弱條目。
- 通用錯誤訊息:防止攻擊者透過錯誤回應識別有效使用者名稱。
身份驗證測試 (WSTG-ATHN)
驗證機制對於驗證使用者身分和防止未經授權的存取至關重要。
對密碼和 2FA 的暴力攻擊
缺乏保護,攻擊者可以透過反覆嘗試猜測密碼或 2FA 代碼。
易受攻擊的程式碼範例:
const express = require('express'); const helmet = require('helmet'); const app = express(); // Use Helmet to secure headers app.use(helmet()); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
問題:
- 無限制的登入嘗試:攻擊者可以重複嘗試不同的密碼或 2FA 代碼。
- 薄弱的 2FA 實作:靜態或可預測的 2FA 程式碼容易受到攻擊。
緩解措施:
實施速率限制並增強 2FA 安全性。
改進的程式碼:
// app.js const express = require('express'); const app = express(); // Error handling middleware app.use((err, req, res, next) => { res.status(500).send(err.stack); // Sends stack trace to the client }); // Your routes here app.listen(3000);
額外措施:
- 嘗試失敗後使用驗證碼:在多次登入嘗試失敗後引入驗證碼來驗證人類使用者。
- 採用 TOTP 進行 2FA: 使用基於時間的一次性密碼來實現動態且安全的 2FA 代碼。
說明:
- 速率限制:透過限制登入嘗試來降低自動攻擊風險。
- 增強的 2FA: 基於時間的程式碼比靜態程式碼提高了安全性。
授權測試(WSTG-ATHZ)
授權確保使用者僅存取他們有權使用的資源,防止未經授權的操作。
不安全的直接物件參考 (IDOR)
使用者可以透過操縱請求中的識別碼來存取未經授權的資源。
易受攻擊的程式碼範例:
// app.js const express = require('express'); const app = express(); // Your routes here // Error handling middleware if (app.get('env') === 'production') { // Production error handler app.use((err, req, res, next) => { // Log the error internally console.error(err); res.status(500).send('An unexpected error occurred.'); }); } else { // Development error handler (with stack trace) app.use((err, req, res, next) => { res.status(500).send(`<pre class="brush:php;toolbar:false">${err.stack}`); }); } app.listen(3000);
問題:
- 未授權存取:使用者可以透過修改orderId參數來存取不該存取的資料。
緩解措施:
在提供存取權限之前驗證資源所有權。
改進的程式碼:
const express = require('express'); const app = express(); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
說明:
- 所有權驗證: 確保要求的資源屬於經過驗證的使用者。
- 存取控制:防止使用者透過操縱請求參數來存取他人的資料。
會話管理測驗 (WSTG-SESS)
會話管理對於維護使用者狀態和確保安全互動至關重要。
沒有過期時間的代幣
永不過期的令牌如果被洩漏就會帶來安全風險。
易受攻擊的程式碼範例:
const express = require('express'); const app = express(); // Disable the X-Powered-By header app.disable('x-powered-by'); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
問題:
- 持久令牌:沒有過期的令牌無限期地保持有效,增加了濫用的機會。
緩解措施:
設定令牌的過期時間。
改進的程式碼:
const express = require('express'); const helmet = require('helmet'); const app = express(); // Use Helmet to secure headers app.use(helmet()); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
說明:
- 令牌過期:限制有效期,降低令牌外洩的風險。
- 安全最佳實務:定期令牌更新可增強整體安全性。
不安全的令牌存放
將令牌儲存在 localStorage 中會使它們遭受跨站腳本 (XSS) 攻擊。
易受攻擊的程式碼範例:
// app.js const express = require('express'); const app = express(); // Error handling middleware app.use((err, req, res, next) => { res.status(500).send(err.stack); // Sends stack trace to the client }); // Your routes here app.listen(3000);
問題:
- 客戶端暴露:惡意腳本可以存取 localStorage、竊取令牌和劫持會話。
緩解措施:
使用僅 HTTP 的 cookie 來安全地儲存令牌。
改進的程式碼:
// app.js const express = require('express'); const app = express(); // Your routes here // Error handling middleware if (app.get('env') === 'production') { // Production error handler app.use((err, req, res, next) => { // Log the error internally console.error(err); res.status(500).send('An unexpected error occurred.'); }); } else { // Development error handler (with stack trace) app.use((err, req, res, next) => { res.status(500).send(`<pre class="brush:php;toolbar:false">${err.stack}`); }); } app.listen(3000);
說明:
- 僅限 HTTP 的 Cookie: JavaScript 無法訪問,從而降低 XSS 風險。
- 安全和 SameSite 標誌: 增強對中間人和跨站點請求偽造攻擊的防護。
輸入驗證測試 (WSTG-INPV)
輸入驗證確保使用者提供的資料安全且符合預期,防止注入攻擊。
缺乏輸入驗證
未經驗證而接受和處理使用者輸入可能會導致漏洞。
易受攻擊的程式碼範例:
const express = require('express'); const jwt = require('jsonwebtoken'); const app = express(); // Weak secret key const SECRET_KEY = 'secret'; app.post('/login', (req, res) => { // Authenticate user (authentication logic not shown) const userId = req.body.userId; // Sign the JWT with a weak secret const token = jwt.sign({ userId }, SECRET_KEY); res.json({ token }); }); app.get('/protected', (req, res) => { const token = req.headers['authorization']; try { // Verify the token using the weak secret const decoded = jwt.verify(token, SECRET_KEY); res.send('Access granted to protected data'); } catch (err) { res.status(401).send('Unauthorized'); } }); app.listen(3000, () => { console.log('Server started on port 3000'); });
問題:
- 注入攻擊:未經驗證的輸入可能導致 SQL 注入、NoSQL 注入或其他程式碼注入攻擊。
緩解措施:
驗證並清理所有使用者輸入。
改進的程式碼:
const express = require('express'); const app = express(); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
說明:
- 輸入驗證: 檢查輸入是否符合預期標準。
- 輸入清理: 刪除或轉義潛在有害字元。
- 安全資料庫查詢:使用參數化查詢可以防止注入攻擊。
錯誤處理測試 (WSTG-ERRH)
正確的錯誤處理可以避免洩漏敏感資訊並改善使用者體驗。
暴露敏感錯誤訊息
詳細的錯誤訊息可以向攻擊者揭示系統內部結構。
易受攻擊的程式碼範例:
const express = require('express'); const app = express(); // Disable the X-Powered-By header app.disable('x-powered-by'); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
問題:
- 資訊外洩:攻擊者可以深入了解您的應用程式的結構和潛在漏洞。
緩解措施:
使用通用錯誤訊息並在內部記錄詳細錯誤。
改進的程式碼:
const express = require('express'); const helmet = require('helmet'); const app = express(); // Use Helmet to secure headers app.use(helmet()); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
說明:
- 內部日誌記錄: 確保詳細錯誤訊息的安全。
- 使用者友善的訊息:提供通用訊息,而不洩漏敏感細節。
弱加密測試 (WSTG-CRYP)
密碼學保護敏感資料;使用弱加密實踐會破壞安全性。
使用不安全的雜湊演算法
使用過時的演算法對密碼進行雜湊處理是不安全的。
易受攻擊的程式碼範例:
// app.js const express = require('express'); const app = express(); // Error handling middleware app.use((err, req, res, next) => { res.status(500).send(err.stack); // Sends stack trace to the client }); // Your routes here app.listen(3000);
問題:
- 弱雜湊: MD5 和 SHA-1 等演算法容易受到碰撞攻擊,不應該用於密碼雜湊。
緩解措施:
使用專為密碼設計的強大雜湊演算法。
改進的程式碼:
// app.js const express = require('express'); const app = express(); // Your routes here // Error handling middleware if (app.get('env') === 'production') { // Production error handler app.use((err, req, res, next) => { // Log the error internally console.error(err); res.status(500).send('An unexpected error occurred.'); }); } else { // Development error handler (with stack trace) app.use((err, req, res, next) => { res.status(500).send(`<pre class="brush:php;toolbar:false">${err.stack}`); }); } app.listen(3000);
說明:
- Bcrypt: 一個強大的雜湊函數,結合了加鹽和多輪雜湊。
- 密碼安全: 使攻擊者在計算上無法對密碼進行逆向工程。
硬編碼密鑰
直接在程式碼中儲存秘密會增加暴露的風險。
易受攻擊的程式碼範例:
const express = require('express'); const jwt = require('jsonwebtoken'); const app = express(); // Weak secret key const SECRET_KEY = 'secret'; app.post('/login', (req, res) => { // Authenticate user (authentication logic not shown) const userId = req.body.userId; // Sign the JWT with a weak secret const token = jwt.sign({ userId }, SECRET_KEY); res.json({ token }); }); app.get('/protected', (req, res) => { const token = req.headers['authorization']; try { // Verify the token using the weak secret const decoded = jwt.verify(token, SECRET_KEY); res.send('Access granted to protected data'); } catch (err) { res.status(401).send('Unauthorized'); } }); app.listen(3000, () => { console.log('Server started on port 3000'); });
問題:
- 秘密曝光:如果程式碼庫遭到破壞,可以輕鬆擷取硬編碼的秘密。
緩解措施:
將機密儲存在環境變數或安全性設定檔中。
改進的程式碼:
const express = require('express'); const app = express(); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
說明:
- 環境變數:對程式碼庫和版本控制系統保密。
- 安全實務:降低意外暴露的風險。
業務邏輯測試 (WSTG-BUSL)
商業邏輯當應用程式流被以意想不到的方式操縱時,就會出現漏洞。
濫用批次操作
不受限制的資料操作可能會導致效能問題或資料外洩。
易受攻擊的程式碼範例:
const express = require('express'); const app = express(); // Disable the X-Powered-By header app.disable('x-powered-by'); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
問題:
- 拒絕服務 (DoS): 大量資料匯出會耗盡伺服器資源。
- 資料外洩:不受限制的存取可能會洩漏敏感資訊。
緩解措施:
實施分頁和存取控制。
改進的程式碼:
const express = require('express'); const helmet = require('helmet'); const app = express(); // Use Helmet to secure headers app.use(helmet()); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
說明:
- 分頁:控制回傳的資料量,防止資源耗盡。
- 存取控制:確保使用者只能存取自己的資料。
客戶端測試 (WSTG-CLNT)
防範客戶端漏洞對於保護使用者免受跨站腳本 (XSS) 等攻擊至關重要。
使用 xss 函式庫轉義使用者輸入
客戶端腳本中對使用者輸入的不當處理可能會導致 XSS 攻擊。
易受攻擊的程式碼範例:
// app.js const express = require('express'); const app = express(); // Error handling middleware app.use((err, req, res, next) => { res.status(500).send(err.stack); // Sends stack trace to the client }); // Your routes here app.listen(3000);
問題:
- 不安全的 DOM 操作: 將未經淨化的使用者輸入插入 innerHTML 會允許執行惡意腳本。
緩解措施:
使用 xss 函式庫在渲染之前清理使用者輸入。
改進的程式碼:
// app.js const express = require('express'); const app = express(); // Your routes here // Error handling middleware if (app.get('env') === 'production') { // Production error handler app.use((err, req, res, next) => { // Log the error internally console.error(err); res.status(500).send('An unexpected error occurred.'); }); } else { // Development error handler (with stack trace) app.use((err, req, res, next) => { res.status(500).send(`<pre class="brush:php;toolbar:false">${err.stack}`); }); } app.listen(3000);
說明:
- 輸入清理: xss 庫透過轉義或刪除潛在危險內容來清理輸入。
- 防止腳本執行:中和惡意腳本,防止它們在瀏覽器中執行。
最佳實務:
- 盡可能使用textContent:將使用者輸入分配給textContent會將其視為純文字。
const express = require('express'); const app = express(); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
- 結合客戶端和伺服器端驗證:深度防禦方法可增強安全性。
API 測試 (WSTG-APIT)
保護 API 端點的安全性對於防止資料外洩和未經授權的存取至關重要。
GraphQL 自省曝光
在生產環境中啟用 GraphQL 自省會暴露您的 API 模式。
易受攻擊的程式碼範例:
const express = require('express'); const app = express(); // Disable the X-Powered-By header app.disable('x-powered-by'); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
問題:
- 架構外洩:攻擊者可以探索您的 API 架構,協助發動有針對性的攻擊。
緩解措施:
在生產環境中停用自省。
改進的程式碼:
const express = require('express'); const helmet = require('helmet'); const app = express(); // Use Helmet to secure headers app.use(helmet()); // Your routes here app.listen(3000, () => { console.log('Server is running on port 3000'); });
說明:
- 條件自省: 允許在開發過程中自省,但在生產中禁用它。
- 安全增強:透過隱藏架構詳細資訊來減少攻擊面。
不受限制的查詢複雜性
深度巢狀或複雜的查詢會耗盡伺服器資源。
易受攻擊的程式碼範例:
// app.js const express = require('express'); const app = express(); // Error handling middleware app.use((err, req, res, next) => { res.status(500).send(err.stack); // Sends stack trace to the client }); // Your routes here app.listen(3000);
問題:
- 拒絕服務 (DoS): 複雜的查詢可能會導致 CPU 和記憶體使用率較高。
緩解措施:
限制查詢深度和複雜性。
改進的程式碼:
// app.js const express = require('express'); const app = express(); // Your routes here // Error handling middleware if (app.get('env') === 'production') { // Production error handler app.use((err, req, res, next) => { // Log the error internally console.error(err); res.status(500).send('An unexpected error occurred.'); }); } else { // Development error handler (with stack trace) app.use((err, req, res, next) => { res.status(500).send(`<pre class="brush:php;toolbar:false">${err.stack}`); }); } app.listen(3000);
說明:
- 深度限制:限制查詢的深度,防止資源耗盡。
- 效能保護: 確保 API 保持回應和可用。
結論
保護 Node.js 應用程式涉及多層方法:
- 防止資訊外洩:清理程式碼和伺服器配置以避免暴露敏感資料。
- 安全地管理設定:刪除預設憑證和安全性設定檔。
- 驗證與清理輸入:永遠不要相信使用者輸入。
- 實施適當的身份驗證和授權:確保使用者擁有適當的存取權限。
- 使用強加密技術:使用安全演算法和金鑰管理來保護資料。
- 優雅地處理錯誤:避免洩漏敏感資訊。
- 保護客戶端互動:減輕 XSS 和其他基於瀏覽器的攻擊。
- 安全 API: 控制資料暴露並實作速率限制。
透過整合這些實踐,您可以增強應用程式的安全性、保護使用者資料並維護信任。
進一步閱讀
- OWASP 網路安全測試指南 (WSTG): OWASP WSTG
- Node.js 安全指南: Node.js 安全
- Express.js 安全提示: Express 安全最佳實踐
- GraphQL 安全最佳實務: Apollo GraphQL 安全
- OWASP 前十名:OWASP 前十名
- MDN Web 文件 - 網路安全: MDN Web 安全
注意:本指南提供一般建議。對於特定的安全問題,請諮詢專業人士。
以上是保護您的 Node.js 應用程式:綜合指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

10款趣味橫生的jQuery遊戲插件,讓您的網站更具吸引力,提升用戶粘性!雖然Flash仍然是開發休閒網頁遊戲的最佳軟件,但jQuery也能創造出令人驚喜的效果,雖然無法與純動作Flash遊戲媲美,但在某些情況下,您也能在瀏覽器中獲得意想不到的樂趣。 jQuery井字棋遊戲 遊戲編程的“Hello world”,現在有了jQuery版本。 源碼 jQuery瘋狂填詞遊戲 這是一個填空遊戲,由於不知道單詞的上下文,可能會產生一些古怪的結果。 源碼 jQuery掃雷遊戲

本教程演示瞭如何使用jQuery創建迷人的視差背景效果。 我們將構建一個帶有分層圖像的標題橫幅,從而創造出令人驚嘆的視覺深度。 更新的插件可與JQuery 1.6.4及更高版本一起使用。 下載

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

Matter.js是一個用JavaScript編寫的2D剛體物理引擎。此庫可以幫助您輕鬆地在瀏覽器中模擬2D物理。它提供了許多功能,例如創建剛體並為其分配質量、面積或密度等物理屬性的能力。您還可以模擬不同類型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流瀏覽器。此外,它也適用於移動設備,因為它可以檢測觸摸並具有響應能力。所有這些功能都使其值得您投入時間學習如何使用該引擎,因為這樣您就可以輕鬆創建基於物理的2D遊戲或模擬。在本教程中,我將介紹此庫的基礎知識,包括其安裝和用法,並提供一

本文演示瞭如何使用jQuery和ajax自動每5秒自動刷新DIV的內容。 該示例從RSS提要中獲取並顯示了最新的博客文章以及最後的刷新時間戳。 加載圖像是選擇


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),