加強 JavaScript 的安全性

每種編程語言都帶有自己的安全漏洞,JavaScript 也不例外。利用 JavaScript 漏洞可能導致數據操縱、會話劫持、未經授權的數據訪問等問題。儘管 JavaScript 安全風險通常與客戶端功能相關,但在服務器端環境中,JavaScript 安全風險也可能帶來重大威脅。

對於任何應用程序,客戶信任都非常重要。維護這種信任需要保護客戶數據並確保應用程序的安全。幸運的是,實施適當的防護措施可以減輕這些風險並增強應用程序的安全性。

在本文中,我們將探討一些最常見的 JavaScript 安全威脅,並討論保護應用程序免受潛在攻擊的有效工具和策略。

跨站腳本攻擊

跨站腳本攻擊(XSS)是一種安全漏洞,允許攻擊者將惡意客戶端代碼注入網站。根據 2021 年開放 Web 應用程序安全項目(OWASP)的十大安全漏洞,XSS 排名第三。

如何緩解 XSS

輸入驗證

確保用戶輸入符合預期的數據類型、格式和範圍。剝離或轉義可能有害字符以防止注入。

JavaScript

 

function validateInput(input) {
  return input.replace(/[^a-zA-Z0-9]/g, ''); // Allow only alphanumeric characters
}

輸出編碼

將輸出中的特殊字元轉換為其 HTML 實體等效物,以在呈現之前中和潛在惡意腳本。

JavaScript

 

function encodeHTML(input) {
  return input.replace(/&/g, '&')
    .replace(/</g, '<')
    .replace(/>/g, '>')
    .replace(/"/g, '"')
    .replace(/'/g, ''');
}

Clickjacking

Clickjacking 是一種欺騙性攻擊,該攻擊騙取使用者點擊他們不打算互動的元素。這種技術涉及將合法網站嵌入到惡意網站中 — 通常使用不可見或具有誤導性位置的 HTML <iframe> — 以劫持使用者操作。結果,攻擊者可以竊取登錄憑證、獲得未授權的權限,甚至欺騙使用者不知不覺安裝惡意軟體。

實現這一目標的一種常見方式是使用 CSS 添加一個具有 opacity 設為接近 0 的重疊按鈕。這樣可以欺騙使用者點擊意外的按鈕或鏈接。

如何防止 Clickjacking

X-Frame-Options 指示瀏覽器網站是否可以嵌入到 iframe 中。它有三個選項:

  1. DENY – 完全防止頁面在 iframe 中顯示
  2. SAMEORIGIN – 只允許頁面在請求來源於相同域時嵌入
  3. ALLOW-FROM – 只允許特定、受信任域嵌入頁面

在 Node.js 中,您可以使用 helmet 設置這些選項,如下所示:

JavaScript

 

const helmet = require("helmet");
const app = express();
app.use(
  helmet({
    xFrameOptions: { action: "sameorigin" },
  }),
);

一种有效的防御点击劫持攻击的方法是实施内容安全策略(CSP)头部。CSP可以对内容嵌入的方式和位置进行精细控制,防止未经授权的框架。

为了减轻点击劫持的风险,在CSP头部中包含frame-ancestors指令。例如:

HTML

 

Content-Security-Policy: frame-ancestors 'self' https://www.example.org;

此策略确保受保护的文档只能由自身来源('self')和明确允许的域名,如example.org,进行嵌入。它阻止所有未经授权的尝试对内容进行框架化,保护用户免受点击劫持攻击。

注意:如果同时设置了frame-ancestors和X-Frame-Options,则支持frame-ancestors的浏览器将忽略X-Frame-Options。

跨站请求伪造(CSRF)

CSRF(有时也称为XSRF)利用网站对用户浏览器的信任,代表用户发出未经授权的请求。攻击者诱使用户在不知情的情况下执行操作,可能导致数据泄露或未经授权的交易。一些示例包括更新受害者的个人资料、从受害者的银行账户发起资金转账,甚至将包裹递送至不同地址。

讓我們看一個具體的例子。您正在訪問您銀行的網站,並已登錄。假設您收到一封冒充銀行的贈品郵件。點擊鏈接後,您會進入一個看似無害的網頁。在幕後,一個POST請求被觸發並發送到合法的銀行應用程序。

PowerShell

 

curl --location --request POST 'https://acmebank.com/transfer?routing=852363&fromAccountNumber=123456789&toAccountNo=987654321' \
--header 'Cookie: session=acmebanksessionvalue'

在acmebank.com應用程序端,“script”標籤在用戶加載頁面時立即提交表單,而無需任何用戶驗證,用戶甚至察覺不到正在發生的事情,如下所示。

HTML

 

<html>
  <body>
    <form action="https://acmebank.com/transfer" method="POST">
      <input type="hidden" routing="852363" fromAccountNo="123456789" toAccountNo="987654321" amount="5000" />
    </form>
    <script>
  	window.addEventListener("DOMContentLoaded", () => {
    document.querySelector("form").submit();
  	});
	</script>
  </body>
</html>

上面的表單將生成以下請求給實際應用程序acmebank。該請求包含合法用戶的會話cookie,但包含我們的銀行帳戶號碼!因為您與銀行的會話仍然活躍,如果沒有其他驗證措施,轉帳金額將通過。

如何防範CSRF攻擊

SameSite屬性設置為Strict。這控制了是否在跨站請求中發送cookie。

  • 這樣的會話cookie應該具有較短的生存期。對於敏感操作,要求重新驗證以減輕風險。

使用CSRF會話唯一令牌。然後將此令牌包含在由瀏覽器發布的表單中。對於每個請求,伺服器會將客戶端發送的令牌與其存儲的會話值進行比較。使用庫csrf-csrf來配置唯一令牌。

竊取會話數據

會話劫持發生在攻擊者竊取用戶的會話令牌時,允許他們冒充用戶並未授權地訪問其帳戶。

如何防止會話劫持

使用安全Cookie

設置會話Cookie的SecureHttpOnly標誌以防止未經授權的訪問。設置Secure屬性可防止會話Cookie以明文形式傳輸,並僅允許其在HTTPS連接上傳輸。設置Http-Only屬性可強制瀏覽器不允許從DOM訪問Cookie 這可防止基於客戶端腳本的攻擊訪問這些Cookie中存儲的敏感數據。

啟用多因素身份驗證(MFA)

為用戶添加額外的安全層。這是您在大多數安全應用程序中會遇到的一種常見方法。可以通過提供者(如OktaDuo)輕鬆集成。

實施會話過期

自動使閒置會話過期,以減少攻擊窗口。

用於高級安全性的編碼實踐和工具

漏洞掃描

漏洞掃描器維護您應用程式的安全性。掃描您的庫、網路、應用程式和設備有助於揭示攻擊者可能利用的弱點。像 SnykSonarqube 這樣的工具可以輕鬆地整合到 JavaScript 代碼庫中。這些工具與 OWASP 維護的已知 漏洞 列表並行工作。作為開發過程的一部分,這些掃描器提供開發人員和安全團隊對代碼漏洞的實時和準確的可見性,以及解決方案來修復它們。

滲透測試和評估

開發人員可以採用滲透測試實踐,主動探測和利用應用程式中的潛在漏洞。道德黑客模擬現實世界的攻擊,通過操控 JavaScript 代碼和用戶互動來評估網絡應用程式的安全態勢。

為了完成這個任務,開發人員可以編寫自定義的 JS 代碼來模擬場景,或者他們可以利用專門的滲透測試工具,利用 JavaScript 自動掃描常見弱點,如 XSS,使用 OWASP ZAP有關滲透測試的更多信息可在 OWASP 官方指南 中找到。

Web 應用程序防火牆(WAF)

隨著應用程序的增長,網絡流量也在增加,暴露於攻擊之下。實施 Web 應用程序防火牆(WAF)有助於通過過濾和監控 HTTP 請求來保護免受惡意流量的侵害。這涉及與 Cloudflare 或 AWS WAF 等第三方 WAF 提供商集成。使用 WAF,您可以定義以下規則:

  • 請求來源的國家或地理位置。
  • 請求來源的 IP 地址、CIDR 範圍和域名。
  • 限制請求長度和查詢參數以防止注入攻擊。
  • 可能是惡意的 SQL 代碼。攻擊者試圖通過在 Web 請求中嵌入惡意的 SQL 代碼來從您的數據庫中提取數據。這就是所謂的 SQL 注入。
  • 檢測並阻止可能是 XSS 攻擊一部分的嵌入式腳本。

WAF 也可以幫助緩解分散式阻斷服務(DDoS)攻擊,確保應用程序的可用性。

保護數據完整性

在存儲或訪問安全信息時,實施健壯的數據完整性措施是必不可少的。最佳實踐包括:

  • 強制執行強大的密碼政策並鼓勵使用密碼管理器。此外,鼓勵您的用戶使用密碼管理器,以便他們可以使用更複雜的密碼,無需擔心記住它們(使用LastPass1Password)。
  • 通過速率限制,在一定次數的失敗嘗試後鎖定帳戶,以及CAPTCHA挑戰,以保護登錄頁面免受暴力攻擊。
  • 使用HTTP標頭,如:

結論

JavaScript 安全是一個持續的過程,需要主動的方式來保護應用程序免受不斷演變的威脅。實施最佳實踐,如輸入驗證、CSP 標頭、安全會話管理和漏洞掃描,可以顯著減少 XSS、CSRF 和會話劫持等攻擊的風險。

此外,利用像 WAF、滲透測試和 MFA 等安全工具可以增強應用程序的韌性。在開發的每個階段優先考慮安全性,將使開發者能夠構建強大且值得用戶信賴的應用程序,從而保持對現代網絡威脅的保護。

Source:
https://dzone.com/articles/enhancing-security-in-javascript