精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

構(gòu)建 Next.js 應(yīng)用時(shí)的安全保障與風(fēng)險(xiǎn)防范措施

開發(fā) 前端
盡管 Next.js 為構(gòu)建安全應(yīng)用提供了堅(jiān)實(shí)的基礎(chǔ),但在開發(fā)過(guò)程中仍有許多需要注意的安全問(wèn)題和最佳實(shí)踐,確保應(yīng)用對(duì)常見漏洞具有足夠的防御能力。

在 Web 應(yīng)用開發(fā)過(guò)程中,確保應(yīng)用的安全性至關(guān)重要,這不僅能保護(hù)用戶數(shù)據(jù),還能防止應(yīng)用本身遭受各種安全攻擊。Next.js 作為一款備受歡迎的 React 框架,內(nèi)置了許多安全功能和推薦做法,但開發(fā)者仍需清楚地了解潛在的安全隱患,并采取合適的防范策略。

一、Next.js 安全問(wèn)題概述

盡管 Next.js 為構(gòu)建安全應(yīng)用提供了堅(jiān)實(shí)的基礎(chǔ),但在開發(fā)過(guò)程中仍有許多需要注意的安全問(wèn)題和最佳實(shí)踐,確保應(yīng)用對(duì)常見漏洞具有足夠的防御能力。

二、服務(wù)器端渲染(SSR)與靜態(tài)站點(diǎn)生成(SSG)的安全策略

2.1 SSR 安全要點(diǎn)

在使用服務(wù)器端渲染時(shí),有幾項(xiàng)關(guān)鍵措施需要注意:

  • 數(shù)據(jù)凈化:始終對(duì)用戶輸入進(jìn)行清洗,防止注入類攻擊。由于 SSR 同時(shí)面臨服務(wù)器端和客戶端的注入風(fēng)險(xiǎn),因此建議使用諸如 DOMPurify 之類的工具。例如:
import DOMPurify from "dompurify";

const sanitizedData = DOMPurify.sanitize(userInput);
  • 敏感數(shù)據(jù)保護(hù):確保在服務(wù)器渲染生成的 HTML 中不暴露敏感信息,如 API 密鑰或用戶詳細(xì)信息。只將必要的數(shù)據(jù)發(fā)送到客戶端:
export async function getServerSideProps(context) {
  const data = await fetchData();
  return {
    props: {
      data: filterSensitiveData(data),
    },
  };
}
  • 防止跨站腳本攻擊(XSS):因?yàn)榉?wù)器生成 HTML 時(shí)需要處理動(dòng)態(tài)內(nèi)容,所以一定要確保所有內(nèi)容都經(jīng)過(guò)轉(zhuǎn)義。例如:
const sanitizedData = escapeHTML(userInput);

function escapeHTML(str) {
  return str.replace(/[&<>"']/g, function (match) {
    return {
      "&": "&",
      "<": "<",
      ">": ">",
      '"': """,
      "'": "'",
    }[match];
  });
}
  • 安全的 API 調(diào)用:利用服務(wù)器端環(huán)境變量存放 API 密鑰等敏感信息,避免泄露給客戶端代碼:
const apiKey = process.env.API_KEY;
const response = await fetch(`https://api.example.com/data?apiKey=${apiKey}`);
  • CSRF 防護(hù):通過(guò) CSRF 令牌保護(hù) SSR 路由免受跨站請(qǐng)求偽造攻擊。例如:
import csrf from "csurf";

const csrfProtection = csrf({ cookie: true });

export default function handler(req, res) {
  csrfProtection(req, res, () => {
    // 此處放置 API 邏輯
  });
}

2.2 SSG 安全注意事項(xiàng)

在靜態(tài)站點(diǎn)生成時(shí),以下措施尤為重要:

  • 數(shù)據(jù)凈化:在構(gòu)建時(shí)對(duì)所有用戶生成的內(nèi)容進(jìn)行清洗,確保嵌入靜態(tài) HTML 的數(shù)據(jù)是安全的。
import DOMPurify from "dompurify";

export async function getStaticProps() {
  const data = await fetchData();
  const sanitizedData = DOMPurify.sanitize(data);

  return {
    props: {
      sanitizedData,
    },
  };
}
  • 內(nèi)容安全策略(CSP):為防范 XSS 和其它注入攻擊,必須配置一套嚴(yán)格的 CSP 策略。這對(duì)于緩存并直接提供靜態(tài)內(nèi)容的站點(diǎn)尤為關(guān)鍵:
// next.config.js
module.exports = {
  async headers() {
    return [
      {
        source: "/(.*)",
        headers: [
          {
            key: "Content-Security-Policy",
            value: "default-src 'self'; script-src 'self' 'unsafe-inline';",
          },
        ],
      },
    ];
  },
};
  • 靜態(tài)文件的安全管理:確保敏感文件不會(huì)對(duì)外公開,通過(guò)重寫或重定向來(lái)控制文件訪問(wèn):
// next.config.js
module.exports = {
  async redirects() {
    return [
      {
        source: "/private-file",
        destination: "/404",
        permanent: false,
      },
    ];
  },
};
  • 環(huán)境變量管理:確保環(huán)境變量不會(huì)暴露給客戶端,通過(guò) getStaticProps 或 getStaticPaths 安全地在構(gòu)建過(guò)程中加載數(shù)據(jù)。
export async function getStaticProps() {
  const apiKey = process.env.API_KEY;
  const data = await fetchData(apiKey);

  return {
    props: {
      data,
    },
  };
}
  • 不可變與可緩存內(nèi)容:保證靜態(tài)資源和生成頁(yè)面具有不可變性和良好的緩存策略,防止內(nèi)容篡改。
// next.config.js
module.exports = {
  async headers() {
    return [
      {
        source: "/(.*)",
        headers: [
          {
            key: "Cache-Control",
            value: "public, max-age=31536000, immutable",
          },
        ],
      },
    ];
  },
};

三、常規(guī)安全最佳實(shí)踐

  • 設(shè)置安全頭部:利用 Helmet.js 等庫(kù)來(lái)添加 HTTP 安全頭部,增強(qiáng)安全防護(hù)。
import helmet from "helmet";

export default function handler(req, res) {
  helmet()(req, res, () => {
    // 此處處理 API 請(qǐng)求
  });
}
  • 依賴管理:定期更新第三方依賴以修補(bǔ)已知安全漏洞。
npm outdated
npm update
  • 漏洞審計(jì):使用 npm audit 等工具掃描依賴,及時(shí)發(fā)現(xiàn)和修復(fù)安全問(wèn)題。
npm audit

四、跨站腳本攻擊(XSS)的防范措施

XSS 攻擊允許攻擊者在其他用戶的頁(yè)面中注入惡意腳本,Next.js 通過(guò)以下措施來(lái)降低這種風(fēng)險(xiǎn):

  • JSX 自動(dòng)轉(zhuǎn)義:React 與 Next.js 默認(rèn)會(huì)將動(dòng)態(tài)數(shù)據(jù)當(dāng)作純文本處理,從而自動(dòng)防范 XSS。
const message = "<script>alert('XSS');</script>";
return <div>{message}</div>; // 最終輸出為 <script>alert('XSS');</script>
  • 謹(jǐn)慎使用 dangerouslySetInnerHTML:在必須直接注入 HTML 的情況下,務(wù)必先進(jìn)行數(shù)據(jù)凈化。
import DOMPurify from "dompurify";

const rawHTML = "<p>這是一段<strong>加粗</strong>文本。</p>";
const sanitizedHTML = DOMPurify.sanitize(rawHTML);

return <div dangerouslySetInnerHTML={{ __html: sanitizedHTML }} />;
  • 雙重凈化用戶輸入:無(wú)論在客戶端還是服務(wù)器端,都必須對(duì)用戶輸入進(jìn)行清洗。
import DOMPurify from "dompurify";

const handleUserInput = (input) => {
  return DOMPurify.sanitize(input);
};

const userComment = handleUserInput(userInput);
return <div>{userComment}</div>;
  • 服務(wù)器端數(shù)據(jù)驗(yàn)證:在 SSR 渲染過(guò)程中,同樣需要驗(yàn)證并凈化傳輸?shù)娇蛻舳说臄?shù)據(jù)。
import DOMPurify from "dompurify";

export async function getServerSideProps(context) {
  const data = await fetchData();
  const sanitizedData = DOMPurify.sanitize(data);

  return {
    props: {
      data: sanitizedData,
    },
  };
}
  • 配置嚴(yán)格的內(nèi)容安全策略(CSP):通過(guò) CSP 限制腳本加載來(lái)源,從而進(jìn)一步降低 XSS 攻擊風(fēng)險(xiǎn)。
// next.config.js
module.exports = {
  async headers() {
    return [
      {
        source: "/(.*)",
        headers: [
          {
            key: "Content-Security-Policy",
            value: "default-src 'self'; script-src 'self' 'unsafe-inline';",
          },
        ],
      },
    ];
  },
};
  • 避免客戶端模板注入:確保模板中使用的數(shù)據(jù)已經(jīng)過(guò)安全編碼,避免通過(guò)字符串拼接構(gòu)造 HTML。
const userInput = "<script>alert('XSS');</script>";
return <div>{userInput}</div>; // 自動(dòng)轉(zhuǎn)義后的安全輸出
  • 保護(hù) API 接口:對(duì) API 接收到的數(shù)據(jù)進(jìn)行驗(yàn)證和凈化,防止惡意數(shù)據(jù)影響服務(wù)器渲染頁(yè)面。
import DOMPurify from "dompurify";

export default function handler(req, res) {
  const sanitizedData = DOMPurify.sanitize(req.body.data);
  // 處理凈化后的數(shù)據(jù)
  res.status(200).json({ data: sanitizedData });
}
  • 使用專門的 XSS 防護(hù)庫(kù):例如 xss、DOMPurify、sanitize-html 等都是常用工具。
import sanitizeHtml from "sanitize-html";

const cleanHtml = sanitizeHtml(dirtyHtml, {
  allowedTags: ["b", "i", "em", "strong", "a"],
  allowedAttributes: {
    a: ["href"],
  },
});
return <div dangerouslySetInnerHTML={{ __html: cleanHtml }} />;
  • 輸入驗(yàn)證與編碼:對(duì)所有輸入進(jìn)行校驗(yàn)和編碼,確保應(yīng)用只呈現(xiàn)安全內(nèi)容。
const validateInput = (input) => {
  // 自定義驗(yàn)證邏輯
  return input.replace(/<script.*?>.*?<\/script>/gi, "");
};

const safeInput = validateInput(userInput);
return <div>{safeInput}</div>;
  • 持續(xù)監(jiān)控與修補(bǔ):定期監(jiān)控應(yīng)用,更新依賴和補(bǔ)丁以防范新發(fā)現(xiàn)的漏洞。
npm audit
npm update

通過(guò)上述措施,你可以有效抵御 XSS 攻擊,保障用戶訪問(wèn)體驗(yàn)和數(shù)據(jù)安全。


五、防范跨站請(qǐng)求偽造(CSRF)攻擊

CSRF 攻擊通過(guò)誘導(dǎo)用戶執(zhí)行非預(yù)期操作來(lái)威脅已認(rèn)證的會(huì)話。為防范此類攻擊,應(yīng)采取如下措施:

  • 使用 CSRF 令牌:為每個(gè)請(qǐng)求生成獨(dú)一無(wú)二且不可預(yù)測(cè)的令牌,確保請(qǐng)求來(lái)源合法。
  • 配置 CSRF 中間件:例如,可以使用 csurf 和 cookie-parser 庫(kù)來(lái)實(shí)現(xiàn)中間件保護(hù):
// pages/api/csrf.js
import csrf from "csurf";
import cookieParser from "cookie-parser";
import { NextApiRequest, NextApiResponse } from "next";

const csrfProtection = csrf({ cookie: true });

export default function handler(req, res) {
  cookieParser()(req, res, () => {
    csrfProtection(req, res, () => {
      res.status(200).json({ csrfToken: req.csrfToken() });
    });
  });
}
  • 在表單或 API 請(qǐng)求中使用 CSRF 令牌:在前端加載令牌后,將其附加到表單或請(qǐng)求頭中:
import { useEffect, useState } from "react";

export default function MyForm() {
  const [csrfToken, setCsrfToken] = useState("");

  useEffect(() => {
    const fetchCsrfToken = async () => {
      const res = await fetch("/api/csrf");
      const data = await res.json();
      setCsrfToken(data.csrfToken);
    };
    fetchCsrfToken();
  }, []);

  const handleSubmit = async (e) => {
    e.preventDefault();
    const res = await fetch("/api/submit", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "CSRF-Token": csrfToken,
      },
      body: JSON.stringify({ data: "example" }),
    });
    const result = await res.json();
    console.log(result);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type="hidden" name="csrfToken" value={csrfToken} />
      <button type="submit">提交</button>
    </form>
  );
}
  • 配置安全 Cookie:確保與 CSRF 防護(hù)相關(guān)的 Cookie 具備 HttpOnly、Secure 以及 SameSite(嚴(yán)格或?qū)捤桑傩浴?/span>
res.setHeader(
  "Set-Cookie",
  cookie.serialize("token", token, {
    httpOnly: true,
    secure: process.env.NODE_ENV === "production",
    maxAge: 3600,
    sameSite: "strict",
    path: "/",
  }),
);
  • 驗(yàn)證請(qǐng)求來(lái)源:通過(guò)檢查 Origin 和 Referrer 頭信息來(lái)確保請(qǐng)求確實(shí)來(lái)自受信任的域名。
function validateRequest(req) {
  const origin = req.headers.origin;
  const referrer = req.headers.referer;
  const allowedOrigins = ["https://yourdomain.com"];

  if (
    !allowedOrigins.includes(origin) ||
    !allowedOrigins.includes(referrer)
  ) {
    throw new Error("無(wú)效的來(lái)源或引用");
  }
}

export default function handler(req, res) {
  try {
    validateRequest(req);
    // 處理合法請(qǐng)求
    res.status(200).json({ message: "請(qǐng)求合法" });
  } catch (error) {
    res.status(403).json({ message: "禁止訪問(wèn)" });
  }
}
  • 保護(hù)敏感路由:確保只有經(jīng)過(guò)認(rèn)證和授權(quán)的用戶才能訪問(wèn)那些涉及數(shù)據(jù)修改或敏感操作的接口。
import { getSession } from "next-auth/client";

export default async function handler(req, res) {
  const session = await getSession({ req });

  if (!session) {
    return res.status(401).json({ message: "未授權(quán)" });
  }

  // 處理經(jīng)過(guò)授權(quán)的請(qǐng)求
  res.status(200).json({ message: "已授權(quán)" });
}
  • 在自定義服務(wù)器中應(yīng)用 CSRF 中間件:如果使用自定義服務(wù)器(如 Express),可全局應(yīng)用該中間件:
const express = require("express");
const next = require("next");
const csrf = require("csurf");
const cookieParser = require("cookie-parser");

const dev = process.env.NODE_ENV !== "production";
const app = next({ dev });
const handle = app.getRequestHandler();

const csrfProtection = csrf({ cookie: true });

app.prepare().then(() => {
  const server = express();

  server.use(cookieParser());
  server.use(csrfProtection);

  server.get("/api/csrf", (req, res) => {
    res.json({ csrfToken: req.csrfToken() });
  });

  server.all("*", (req, res) => {
    return handle(req, res);
  });

  server.listen(3000, (err) => {
    if (err) throw err;
    console.log("> 服務(wù)器已啟動(dòng),訪問(wèn) http://localhost:3000");
  });
});

總之,采用 CSRF 令牌、配置安全 Cookie、驗(yàn)證請(qǐng)求來(lái)源以及對(duì)敏感路由進(jìn)行保護(hù),是防范跨站請(qǐng)求偽造攻擊的有效手段。

六、認(rèn)證與授權(quán)

在構(gòu)建安全應(yīng)用時(shí),完善的認(rèn)證和授權(quán)機(jī)制是必不可少的。以下是 Next.js 中實(shí)現(xiàn)認(rèn)證和授權(quán)的一些建議:

6.1 用戶認(rèn)證

用戶認(rèn)證用于驗(yàn)證用戶身份。在 Next.js 中,可以通過(guò) NextAuth.js 等庫(kù)來(lái)實(shí)現(xiàn)。例如:

  • 安裝 NextAuth.js
npm install next-auth
  • 配置認(rèn)證:在 pages/api/auth/[...nextauth].js 中設(shè)置認(rèn)證提供商和回調(diào)函數(shù)。
// pages/api/auth/[...nextauth].js
import NextAuth from "next-auth";
import Providers from "next-auth/providers";

export default NextAuth({
  providers: [
    Providers.Google({
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    }),
    // 可添加其他認(rèn)證方式
  ],
  database: process.env.DATABASE_URL,
  session: {
    jwt: true,
  },
  callbacks: {
    async session(session, token) {
      session.user.id = token.id;
      return session;
    },
    async jwt(token, user) {
      if (user) {
        token.id = user.id;
      }
      return token;
    },
  },
});
  • 在組件中使用認(rèn)證:通過(guò)檢測(cè)用戶會(huì)話來(lái)保護(hù)頁(yè)面或組件。
import { useSession, signIn, signOut } from "next-auth/client";

export default function MyComponent() {
  const [session, loading] = useSession();

  if (loading) return <p>加載中...</p>;
  if (!session) return <button onClick={() => signIn()}>登錄</button>;

  return (
    <>
      <p>歡迎您, {session.user.name}</p>
      <button onClick={() => signOut()}>退出</button>
    </>
  );
}

6.2 用戶授權(quán)

授權(quán)確保只有具備特定權(quán)限的用戶才能訪問(wèn)某些資源或執(zhí)行特定操作。

  • 基于角色的訪問(wèn)控制(RBAC):為用戶定義角色,并在數(shù)據(jù)庫(kù)中保存對(duì)應(yīng)權(quán)限。
const roles = {
  admin: "admin",
  user: "user",
};
  • 保護(hù) API 路由:在 API 中根據(jù)用戶角色判斷是否允許訪問(wèn)。
import { getSession } from "next-auth/client";

export default async function handler(req, res) {
  const session = await getSession({ req });

  if (!session || session.user.role !== "admin") {
    return res.status(403).json({ message: "禁止訪問(wèn)" });
  }

  // 處理經(jīng)過(guò)授權(quán)的請(qǐng)求
  res.status(200).json({ message: "訪問(wèn)成功" });
}
  • 保護(hù)頁(yè)面:可使用高階組件(HOC)或自定義 hook 根據(jù)用戶角色進(jìn)行頁(yè)面權(quán)限控制。
import { useSession } from "next-auth/client";
import { useRouter } from "next/router";
import { useEffect } from "react";

const withAuth = (WrappedComponent, role) => {
  return (props) => {
    const [session, loading] = useSession();
    const router = useRouter();

    useEffect(() => {
      if (!loading) {
        if (!session) {
          router.push("/api/auth/signin");
        } else if (session.user.role !== role) {
          router.push("/unauthorized");
        }
      }
    }, [session, loading]);

    if (loading || !session || session.user.role !== role) {
      return <p>加載中...</p>;
    }

    return <WrappedComponent {...props} />;
  };
};

export default withAuth;

使用該高階組件保護(hù)頁(yè)面:

import withAuth from "../path/to/withAuth";

const AdminPage = () => {
  return <p>歡迎管理員</p>;
};

export default withAuth(AdminPage, "admin");
  • 其他建議:始終采用 HTTPS、設(shè)置 HttpOnly 與 Secure 屬性的 Cookie、實(shí)施多重認(rèn)證(MFA)、定期審核用戶角色以及記錄審計(jì)日志,以便追蹤和分析可疑活動(dòng)。

七、內(nèi)容安全策略(CSP)的配置

CSP 利用 HTTP 頭部控制允許加載的資源類型,是防范 XSS 和數(shù)據(jù)注入的重要手段。

7.1 理解 CSP 頭部

通過(guò)設(shè)置 Content-Security-Policy 頭部,可以限定內(nèi)容加載的來(lái)源。例如:

Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.google.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:;
  • **default-src 'self'**:默認(rèn)僅允許同源內(nèi)容加載。
  • script-src 'self' https://apis.google.com:腳本僅允許同源和指定 API 來(lái)源。
  • **style-src 'self' 'unsafe-inline'**:樣式允許同源和內(nèi)聯(lián)樣式(盡量避免 'unsafe-inline')。
  • **img-src 'self' data:**:圖片來(lái)源限制為同源或 data URI。

7.2 在 Next.js 中配置 CSP

  • 通過(guò) next.config.js 添加 CSP 頭部
// next.config.js
module.exports = {
  async headers() {
    return [
      {
        source: "/(.*)",
        headers: [
          {
            key: "Content-Security-Policy",
            value:
              "default-src 'self'; script-src 'self' https://apis.google.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:;",
          },
        ],
      },
    ];
  },
};
  • 在自定義服務(wù)器中設(shè)置 CSP(例如使用 Express):
const express = require("express");
const next = require("next");

const dev = process.env.NODE_ENV !== "production";
const app = next({ dev });
const handle = app.getRequestHandler();

app.prepare().then(() => {
  const server = express();

  server.use((req, res, next) => {
    res.setHeader(
      "Content-Security-Policy",
      "default-src 'self'; script-src 'self' https://apis.google.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:;",
    );
    next();
  });

  server.all("*", (req, res) => {
    return handle(req, res);
  });

  server.listen(3000, (err) => {
    if (err) throw err;
    console.log("> 服務(wù)器已啟動(dòng),訪問(wèn) http://localhost:3000");
  });
});

7.3 CSP 的最佳實(shí)踐

  • 使用 nonce 或哈希:盡量避免 'unsafe-inline',可以采用動(dòng)態(tài)生成的 nonce 或預(yù)設(shè)的哈希值來(lái)允許特定內(nèi)聯(lián)腳本或樣式。
  • 避免使用通配符:不要輕易使用 *,以免放寬安全限制。
  • 報(bào)告違規(guī)行為:通過(guò) report-uri 或 report-to 指令獲取 CSP 違規(guī)報(bào)告,及時(shí)發(fā)現(xiàn)和解決問(wèn)題。
  • 逐步收緊策略:可以從較寬松的策略開始,然后逐步收緊以覆蓋所有必要的資源來(lái)源。
  • 測(cè)試與監(jiān)控:定期使用工具(如 Google 的 CSP Evaluator)測(cè)試 CSP 配置,并監(jiān)控違規(guī)報(bào)告。

例如,一個(gè)較為全面的 CSP 配置如下:

// next.config.js
module.exports = {
  async headers() {
    return [
      {
        source: "/(.*)",
        headers: [
          {
            key: "Content-Security-Policy",
            value:
              "default-src 'self'; script-src 'self' https://apis.google.com 'nonce-<randomNonce>'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self' https://api.example.com; font-src 'self' https://fonts.gstatic.com; frame-src 'self' https://www.youtube.com; object-src 'none'; base-uri 'self'; form-action 'self'; report-uri /csp-violation-report-endpoint;",
          },
        ],
      },
    ];
  },
};

八、訪問(wèn)速率限制

為防止暴力破解、DDoS 攻擊或資源濫用,實(shí)現(xiàn)請(qǐng)求速率限制是一種有效的防護(hù)手段。

8.1 速率限制原理

速率限制控制某個(gè)用戶在一定時(shí)間內(nèi)發(fā)出的請(qǐng)求數(shù)量,常見的策略有固定窗口、滑動(dòng)窗口和令牌桶算法等。

8.2 在 Next.js 中實(shí)現(xiàn)速率限制

可以借助 Express 中間件和 express-rate-limit 包來(lái)實(shí)現(xiàn),例如:

  1. 安裝依賴
npm install express express-rate-limit
  1. 設(shè)置自定義服務(wù)器并配置中間件
// server.js
const express = require("express");
const next = require("next");
const rateLimit = require("express-rate-limit");

const dev = process.env.NODE_ENV !== "production";
const app = next({ dev });
const handle = app.getRequestHandler();

// 定義速率限制規(guī)則:15 分鐘內(nèi)每個(gè) IP 最多 100 次請(qǐng)求
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000,
  max: 100,
  message: "來(lái)自該 IP 的請(qǐng)求過(guò)多,請(qǐng)15分鐘后重試",
});

app.prepare().then(() => {
  const server = express();

  // 為所有請(qǐng)求應(yīng)用速率限制
  server.use(limiter);

  server.all("*", (req, res) => {
    return handle(req, res);
  });

  server.listen(3000, (err) => {
    if (err) throw err;
    console.log("> 服務(wù)器已啟動(dòng),訪問(wèn) http://localhost:3000");
  });
});
  1. 運(yùn)行服務(wù)器:通過(guò) node server.js 啟動(dòng)服務(wù),并測(cè)試是否在超出限制后返回 429 狀態(tài)碼。

8.3 高級(jí)速率限制方案

對(duì)于分布式系統(tǒng),可以使用 Redis 作為存儲(chǔ)后端來(lái)追蹤請(qǐng)求數(shù):

  1. 安裝 Redis 相關(guān)依賴
npm install redis rate-limit-redis
  1. 修改服務(wù)器配置
// server.js
const express = require("express");
const next = require("next");
const rateLimit = require("express-rate-limit");
const RedisStore = require("rate-limit-redis");
const Redis = require("ioredis");

const dev = process.env.NODE_ENV !== "production";
const app = next({ dev });
const handle = app.getRequestHandler();

const redisClient = new Redis();

const limiter = rateLimit({
  store: new RedisStore({
    client: redisClient,
  }),
  windowMs: 15 * 60 * 1000,
  max: 100,
  message: "來(lái)自該 IP 的請(qǐng)求過(guò)多,請(qǐng)15分鐘后重試",
});

app.prepare().then(() => {
  const server = express();

  server.use(limiter);

  server.all("*", (req, res) => {
    return handle(req, res);
  });

  server.listen(3000, (err) => {
    if (err) throw err;
    console.log("> 服務(wù)器已啟動(dòng),訪問(wèn) http://localhost:3000");
  });
});

采用速率限制可以有效防止惡意攻擊、暴力破解等行為,同時(shí)建議針對(duì)不同的用戶角色、接口進(jìn)行更細(xì)粒度的控制,并配合監(jiān)控和告警機(jī)制。

九、其他安全措施

  • 安全頭部設(shè)置:使用 Helmet.js 設(shè)置各種 HTTP 頭部,增強(qiáng)應(yīng)用安全。
import helmet from "helmet";

export default function handler(req, res) {
  helmet()(req, res, () => {
    // 處理 API 請(qǐng)求
  });
}
  • 依賴管理:定期更新依賴包并利用工具(如 npm audit)檢查安全漏洞。
npm outdated
npm update
npm audit
  • 環(huán)境變量管理
  • 將敏感信息存放于 .env 文件(如 .env.local.env.production),并確保這些文件不被提交到版本控制。
  • 使用 process.env.VARIABLE_NAME 獲取變量,開發(fā)時(shí)可利用 dotenv 加載環(huán)境變量。
  • 部署時(shí)確保環(huán)境變量安全配置,并定期輪換 API 密鑰或其它機(jī)密信息。
  • 靜態(tài)文件訪問(wèn)控制:確保敏感的靜態(tài)文件不對(duì)外開放訪問(wèn),可通過(guò)配置 rewrites 來(lái)控制。
// next.config.js
module.exports = {
  async rewrites() {
    return [
      {
        source: "/api/:path*",
        destination: "/:path*", // 匹配所有 API 路由
      },
    ];
  },
};

通過(guò)上述安全策略和最佳實(shí)踐,你可以構(gòu)建出既高效又能有效防御常見網(wǎng)絡(luò)攻擊的 Next.js 應(yīng)用,保障用戶數(shù)據(jù)安全及應(yīng)用穩(wěn)定運(yùn)行。

責(zé)任編輯:武曉燕 來(lái)源: 大遷世界
相關(guān)推薦

2009-07-05 11:27:09

2013-05-22 16:46:02

2017-03-23 09:13:56

2011-03-22 14:57:07

2012-12-27 10:53:12

2009-12-23 16:10:14

2011-11-25 15:58:43

2012-12-25 13:45:37

2009-12-09 11:54:35

2022-03-31 14:55:31

網(wǎng)絡(luò)安全漏洞

2009-06-19 21:18:23

2010-01-13 10:22:27

2011-03-01 17:35:46

2012-11-22 14:45:28

2015-03-10 09:46:11

2019-08-30 08:57:36

勒索病毒漏洞網(wǎng)絡(luò)攻擊

2009-04-23 00:18:07

2011-03-22 14:55:40

2022-07-04 09:00:00

帳戶劫持信息安全攻擊

2025-02-14 08:56:09

GoroutineContextChannel
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

色悠悠久久久久| 自拍偷拍亚洲综合| 国产91在线播放九色快色| 国产探花视频在线| 亚洲日本精品国产第一区| 日本中文字幕网| 欧美中文一区二区| 欧美日本一道本在线视频| 91精品综合久久| 国产在线观看黄色| 日本国产一区| 亚洲成人av电影在线| 日韩精品久久久免费观看| www日韩精品| 91精品综合久久久久久久久久久| 一本色道久久综合亚洲精品按摩| 国产欧美在线一区二区| 天天综合久久综合| 精品成人一区| 久久久国产在线视频| 国产精品成人一区二区三区电影毛片| 成人在线视频国产| 在线观看免费亚洲| a级黄色一级片| 污污的网站在线看| 国产精品三级久久久久三级| 久久久一本精品99久久精品| 国产黄色片免费观看| 毛片不卡一区二区| 国产成人精品久久| 影音先锋在线国产| 亚洲国产免费看| 欧美美女18p| 日韩免费av一区| 国产99久久精品一区二区300| 精品成人a区在线观看| 杨幂一区二区国产精品| 345成人影院| 天天综合色天天| 波多野结衣av一区二区全免费观看| 老司机免费在线视频| 欧美经典三级视频一区二区三区| 欧美精品七区| 免费理论片在线观看播放老| 欧美xxxxxx| 9久草视频在线视频精品| 草莓视频一区| 精品人妻aV中文字幕乱码色欲| 九九视频精品免费| 久久精品国产99国产精品澳门| 色无极影院亚洲| 亚洲aaa级| 日韩禁在线播放| 精品日韩久久久| 欧美精品电影| 国产精品高潮呻吟久久| 亚洲va韩国va欧美va精四季| 国产精品欧美综合亚洲| 久热成人在线视频| 成人福利在线观看| 国产又色又爽又黄又免费| 免费观看30秒视频久久| 国产欧美一区二区三区在线| 欧美成人aaa片一区国产精品| 极品一区美女高清| 精品女同一区二区| 成人3d动漫一区二区三区| 欧洲不卡视频| 综合久久给合久久狠狠狠97色| 一区二区三区在线视频看| 欧美激情办公室videoshd| 亚洲人成网站影音先锋播放| 欧洲精品视频在线| 波多野结衣在线观看| 亚洲国产日日夜夜| 1024av视频| jizzjizz少妇亚洲水多| 亚洲精品日产精品乱码不卡| 成人午夜免费剧场| free性欧美16hd| 久久久精品免费观看| 日本欧美精品久久久| 丝袜美腿美女被狂躁在线观看| 亚洲视频在线一区观看| 精品人妻少妇一区二区| 久久91导航| 91.com视频| 玖玖爱在线精品视频| 国产一区三区在线播放| 欧美成人手机在线| 91精品成人久久| 99视频在线免费| 久久国产三级| 国产欧美日韩| 亚洲片在线观看| 日韩三级在线观看视频| 日韩午夜电影| 成人av.网址在线网站| 亚洲国产剧情在线观看| 99久久婷婷国产精品综合| 国产91精品一区二区绿帽| 国产在线黄色| 一区二区在线观看免费视频播放| 久久精品.com| 日韩成人在线看| 亚洲人成在线一二| 国产在线综合网| 午夜久久久久久久久久| 久久综合国产精品| 日本黄色a视频| 成人福利av| 日韩欧美综合一区| 婷婷丁香综合网| 国产精品一页| 成人在线观看91| 日韩理伦片在线| 国语对白一区二区| 欧美成人亚洲| 国产精品久久一区主播| 欧美成人精品欧美一| 久久蜜桃精品| 好看的日韩精品视频在线| 国产在线高清视频| 欧美午夜精品理论片a级按摩| 视频免费在线观看| 欧美成人午夜77777| 久久伊人色综合| 中文字幕一区二区人妻痴汉电车| 久久亚洲综合色| 国产主播自拍av| 91免费精品国偷自产在线在线| 久久精品2019中文字幕| 中文 欧美 日韩| 久久精品夜色噜噜亚洲aⅴ| 国产素人在线观看| 老牛国内精品亚洲成av人片| 欧美精品在线播放| 国产女人爽到高潮a毛片| 国产精品久久777777| 国内自拍视频网| 国产精品亚洲片在线播放| 538国产精品一区二区免费视频| 6080午夜伦理| 99久久国产综合精品女不卡| 国产91在线亚洲| 一区二区日韩| 高清欧美性猛交xxxx| 黄色一级大片在线免费看国产一 | 99精品久久久久久中文字幕 | 国产小视频在线看| 国产成人精品免费一区二区| 国产精品视频网站在线观看| 91精品导航| 久久久久久国产免费| 日韩一级免费毛片| 日韩欧美精品网址| 国产黄色大片免费看| 亚洲草久电影| 亚洲精品日韩av| 免费不卡av| 亚洲国语精品自产拍在线观看| 欧美不卡视频在线观看| 久久理论电影网| xx欧美撒尿嘘撒尿xx| 久久精品青草| 国产成人一区二区三区免费看| 欧美aa在线| 在线观看免费高清视频97| 国产精品毛片久久久久久久av| 一区二区在线电影| 97人妻天天摸天天爽天天| 天堂蜜桃91精品| 亚洲第一精品区| 国产乱论精品| 国产精品成人播放| 在线看女人毛片| 欧亚一区二区三区| 亚洲色偷偷综合亚洲av伊人| 成人午夜私人影院| 粉嫩虎白女毛片人体| 我不卡影院28| 久久精品magnetxturnbtih| 嫩草伊人久久精品少妇av杨幂| 久久伊人精品天天| 色视频在线看| 制服丝袜亚洲播放| 国产黄色免费观看| 亚洲日本韩国一区| 国产精品一区二区入口九绯色| 男女性色大片免费观看一区二区| 日本精品福利视频| 国产精品亚洲二区| 国产精品一码二码三码在线| 亚洲日本在线观看视频| 久久久久久久久国产精品| 成人在线免费电影| 亚洲国产精品99| 国产又粗又猛视频| 欧美性猛xxx| 欧美激情国产精品免费| 国产亚洲精品久| 东京热av一区| 国产一区二区三区在线观看精品 | 久久久国产精品x99av| 日韩大胆人体| 欧美成人性福生活免费看| 国产成人麻豆免费观看| 亚洲动漫第一页| 四虎永久免费地址| 久久久高清一区二区三区| 国产艳妇疯狂做爰视频 | 91在线直播亚洲| 久久毛片亚洲| 77777亚洲午夜久久多人| av免费在线观看网址| 中文字幕日韩欧美| 日韩私人影院| 亚洲精品成人免费| 亚洲av无码国产精品永久一区| 欧美日韩视频在线一区二区 | 女人高潮被爽到呻吟在线观看| 色中色综合影院手机版在线观看| 日本黄色片在线观看| 亚洲人精品午夜在线观看| 深夜福利视频在线观看| 欧美精品一区视频| 亚洲高清精品视频| 欧美一二三区精品| 国产一区二区波多野结衣| 欧美视频中文字幕| 中文字幕乱码一区二区| 色拍拍在线精品视频8848| 激情五月色婷婷| 午夜久久久久久久久| 久久黄色免费网站| 亚洲综合清纯丝袜自拍| 欧美成人精品一区二区免费看片| 亚洲三级电影全部在线观看高清| 999精品在线视频| 国产精品久久一卡二卡| jizzjizzjizz国产| 国产精品福利一区二区| 羞羞在线观看视频| **欧美大码日韩| 久久高清内射无套| 亚洲精品国产无套在线观| 日日骚一区二区三区| 一区二区三区久久| 四虎成人精品永久免费av| 亚洲高清视频的网址| 影音先锋亚洲天堂| 日韩欧美a级成人黄色| 夜夜爽妓女8888视频免费观看| 日本道精品一区二区三区| 中文字幕一区二区久久人妻| 欧美日韩一区不卡| 99久久免费国产精精品| 欧美成人性战久久| 日韩大胆人体| 日韩中文在线中文网在线观看| 91在线观看| 欧美精品少妇videofree| 99riav视频在线观看| 日韩av高清不卡| 日韩黄色三级| 国产精品一区二区免费| 亚洲伊人春色| 在线视频不卡国产| 影音先锋久久资源网| 激情综合网婷婷| 国内精品久久久久影院色| 波多野吉衣在线视频| 26uuu另类欧美| 国产黄色录像片| 亚洲影视在线播放| 中文字幕精品视频在线观看| 欧美高清www午色夜在线视频| 亚洲精品一区二区三区蜜桃| 亚洲人成毛片在线播放| 麻豆免费在线视频| 38少妇精品导航| 日韩欧美专区| 久久伊人资源站| 久久激情电影| 欧美亚洲精品一区二区| 久久成人精品无人区| 中国xxxx性xxxx产国| 欧美高清在线一区二区| 国产无遮挡aaa片爽爽| 欧美中文字幕久久| 国产91麻豆视频| 国产一区二区三区在线观看视频 | 国产91色在线|免| 国产一区二区高清在线| 欧美日韩一区二区视频在线| 欧美成人一品| 五月婷婷之综合激情| 成人永久看片免费视频天堂| 国产精品酒店视频| 午夜激情一区二区三区| 欧美一区二区三区四区在线| 国产欧美自拍| 久久福利电影| 亚洲欧美伊人| 91精品视频免费| 日韩a级片在线观看| 亚洲高清中文字幕| 国产人妖一区二区三区| 亚洲视频在线看| 国产不卡人人| 91精品国产乱码久久久久久蜜臀| 欧美黄页免费| 日韩欧美一区二区三区四区| 一本久道综合久久精品| 又黄又爽又色的视频| 中文欧美字幕免费| 精品免费囯产一区二区三区| 精品国产亚洲在线| 中中文字幕av在线| 成人久久久久爱| 欧美美女视频| 日韩毛片在线免费看| 91网站黄www| 日韩av免费网址| 日韩欧美国产精品一区| 麻豆视频在线观看免费网站| 国产精品高潮粉嫩av| 九九在线高清精品视频| 久久久一本二本三本| 92国产精品观看| 日韩久久久久久久久| 欧美精品一区二区高清在线观看| 日皮视频在线观看| 成人黄色片视频网站| 欧美一区精品| 中文字幕在线国产| 亚洲妇熟xx妇色黄| 全国男人的天堂网| 性色av一区二区三区在线观看| 6080成人| aa视频在线播放| 91麻豆国产福利在线观看| 色播视频在线播放| 精品亚洲精品福利线在观看| 少妇淫片在线影院| 欧美色图亚洲自拍| 免费亚洲电影在线| 久久一级免费视频| 欧美精品成人一区二区三区四区| 日本在线免费| 91成人免费在线观看| 午夜国产欧美理论在线播放 | 六月丁香激情综合| 亚洲美女在线看| 欧美日韩五区| 国产福利片一区二区| 国产电影精品久久禁18| 精品无码在线视频| 日韩欧美精品中文字幕| 国产系列在线观看| 欧美国产第一页| 国产精品极品| 久久国产色av免费观看| 欧美激情资源网| 国产乱淫av免费| 国语自产精品视频在免费| 香蕉久久夜色精品国产更新时间| 亚洲精品视频导航| 亚洲男人天堂av网| 日韩在线观看视频一区| 国产91免费看片| 亚洲91视频| 一区二区视频观看| 欧美女孩性生活视频| 高清电影在线免费观看| 日本10禁啪啪无遮挡免费一区二区 | 玖玖玖电影综合影院| 毛片在线视频播放| 国产精品毛片大码女人| 风流老熟女一区二区三区| 国产成人精品999| 欧美二区不卡| 99久久精品免费视频| 9191久久久久久久久久久| 成入视频在线观看| 一区二区免费在线观看| 91婷婷韩国欧美一区二区| 国产精品乱码一区二区| 国产91av在线| 综合国产在线| aaaaa级少妇高潮大片免费看| 欧美高清hd18日本| 亚洲精品mv| 成人在线免费高清视频| 国产亚洲精品久| 隣の若妻さん波多野结衣| 国产精品一区二区三区免费视频| 伊人影院久久| 动漫性做爰视频| 在线观看欧美日韩国产|