در Next.js، تغییر دادهها (mutation) مانند افزودن آیتم، خروج از حساب یا بهروزرسانی پایگاه داده، با استفاده از Server Actions انجام میشود. این اکشنها بهصورت پیشفرض بهعنوان endpoint عمومی در نظر گرفته میشوند و باید با فرض امنیتی مشابه APIهای عمومی مدیریت شوند.
شناسهها هر ۱۴ روز یا پس از invalidate شدن کش build مجدداً تولید میشوند. با این حال، باید Server Actions را مانند endpointهای عمومی در نظر گرفت و احراز هویت و اعتبارسنجی را جدی گرفت.
ورودیهایی مانند فرمها، پارامترهای URL، headers و searchParams قابل دستکاری هستند. مثال:
// BAD: اعتماد به searchParams
const isAdmin = searchParams.get('isAdmin')
if (isAdmin === 'true') return <AdminPanel />
// GOOD: اعتبارسنجی مجدد با توکن
const token = cookies().get('AUTH_TOKEN')
const isAdmin = await verifyAdmin(token)
if (isAdmin) return <AdminPanel />هر Server Action باید بررسی کند که کاربر مجاز به انجام آن عملیات است:
'use server'
import { auth } from './lib'
export function addItem() {
const { user } = auth()
if (!user) throw new Error('You must be signed in to perform this action')
// ...
}تعریف Server Action داخل کامپوننت باعث ایجاد closure میشود که به متغیرهای بیرونی دسترسی دارد. مثال:
export default async function Page() {
const publishVersion = await getLatestVersion()
async function publish() {
"use server"
if (publishVersion !== await getLatestVersion()) {
throw new Error('The version has changed')
}
}
return (
<form>
<button formAction={publish}>Publish</button>
</form>
)
}Next.js متغیرهای closure را رمزنگاری میکند و برای هر build کلید جدید تولید میشود. با این حال، نباید فقط به رمزنگاری برای محافظت از دادههای حساس تکیه کرد.
در حالت self-hosted، میتوانید کلید رمزنگاری را با متغیر NEXT_SERVER_ACTIONS_ENCRYPTION_KEY تنظیم کنید تا در همهٔ سرورها یکسان باشد. این کلید باید با AES-GCM رمزنگاری شده باشد.
Server Actions فقط با متد POST فراخوانی میشوند و از مقایسهٔ هدر Origin با Host برای جلوگیری از حملات CSRF استفاده میکنند.
برای معماریهای پیچیده، میتوانید لیست originهای مجاز را در next.config.js تنظیم کنید:
module.exports = {
experimental: {
serverActions: {
allowedOrigins: ['my-proxy.com', '*.my-proxy.com'],
},
},
}تغییر دادهها نباید در متدهای رندر انجام شوند. مثال اشتباه:
// BAD
if (searchParams.get('logout')) {
cookies().delete('AUTH_TOKEN')
}روش صحیح:
// GOOD
import { logout } from './actions'
<form action={logout}>
<button type="submit">Logout</button>
</form>"use client" دادههای خصوصی دریافت میکنند؟"use server" ورودیها را اعتبارسنجی میکنند؟/[param]/ اعتبارسنجی شدهاند؟proxy.ts و route.ts بررسی امنیتی شدهاند؟Server Actions در Next.js ابزار قدرتمندی برای مدیریت تغییر دادهها هستند، اما باید با دقت و امنیت کامل استفاده شوند. اعتبارسنجی ورودی، احراز هویت، رمزنگاری، و جلوگیری از اثرات جانبی در رندرینگ از اصول کلیدی در طراحی امن اکشنها هستند.