Walidacja żądań i bezpieczeństwo
Implementuj walidację danych wejściowych i zabezpieczaj trasy API przed typowymi podatnościami.
Walidacja żądań i bezpieczeństwo to bezpłatna lekcja Next.js 15 Fullstack Web Apps na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Next.js 15 Fullstack Web Apps, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Next.js 15 Fullstack Web Apps zawiera 4 lekcji w sumie.
Części tej lekcji nie zostały jeszcze przetłumaczone i są wyświetlane po angielsku.
Why Validate & Secure Requests?
When building web applications, especially with API routes, you'll receive data from users. This data often comes from forms, client-side requests, or other external sources.
It's crucial to ensure this incoming data is valid and safe. Without proper validation and security measures, your application can be vulnerable to errors, data corruption, or even malicious attacks.
What is Input Validation?
Input validation is the process of ensuring that data provided by a user (or another system) meets specific criteria before your application processes it. This involves checking:
- Data Type: Is it a string, number, boolean?
- Format: Does an email address look like an email? Is a date in the correct format?
- Length: Is a username between 3 and 20 characters?
- Range: Is an age a positive number?
- Content: Does it contain only allowed characters?
Client vs. Server-Side Validation
You might perform validation on the client-side (in the browser) for a better user experience, providing instant feedback.
However, server-side validation is non-negotiable for security and data integrity. Client-side validation can be bypassed by malicious users. Always validate data on your server before processing it or storing it in a database.
Introducing Zod for Validation
Zod is a popular TypeScript-first schema declaration and validation library. It allows you to define the expected shape and types of your data, then validate incoming data against that schema.
Key benefits:
- Type Safety: Infers types from your schemas.
- Robust: Handles complex validation rules.
- Developer Friendly: Easy to read and write.
Basic Zod Schema Example
Let's see how to define a simple Zod schema for user input. This example checks for a valid username, email, and age.
Try running it with both valid and invalid data.
const { z } = require('zod');
const UserSchema = z.object({
username: z.string().min(3, "Username too short"),
email: z.string().email("Invalid email format"),
age: z.number().int().positive("Age must be positive"),
});
const validData = {
username: "coddyuser",
email: "coddy@example.com",
age: 30,
};
const invalidData = {
username: "co",
email: "bad-email",
age: -10,
};
console.log("--- Valid Data Test ---");
try {
const parsed = UserSchema.parse(validData);
console.log("Valid data:", parsed);
} catch (error) {
console.error("Validation failed:", error.errors);
}
console.log("\n--- Invalid Data Test ---");
try {
const parsed = UserSchema.parse(invalidData);
console.log("Valid data:", parsed);
} catch (error) {
console.error("Validation failed:", error.errors);
}Integrating Zod in Route Handlers
In Next.js, you'll use Zod within your API Route Handlers (e.g., app/api/users/route.ts) to validate incoming request bodies. This ensures that any data sent to your API meets your expectations before further processing.
We typically use a try-catch block to handle potential validation errors.
import { NextResponse } from 'next/server';
import { z } from 'zod';
// Define the schema for creating a new post
const CreatePostSchema = z.object({
title: z.string().min(5, 'Title must be at least 5 characters.'),
content: z.string().min(10, 'Content must be at least 10 characters.'),
authorId: z.string().uuid('Author ID must be a valid UUID.'),
});
export async function POST(request: Request) {
try {
const body = await request.json();
// Validate the request body using Zod
const validatedData = CreatePostSchema.parse(body);
// If validation passes, proceed with your logic
// e.g., save to database, perform other operations
console.log('Received valid post data:', validatedData);
return NextResponse.json(
{ message: 'Post created successfully', data: validatedData },
{ status: 201 }
);
} catch (error) {
// We'll handle errors in the next scene!
return NextResponse.json(
{ message: 'An unexpected error occurred.' },
{ status: 500 }
);
}
}Handling Validation Errors Gracefully
When Zod validation fails, it throws a ZodError. It's important to catch this specific error and return a clear, informative response to the client, typically with an HTTP 400 Bad Request status code.
This helps client applications understand what went wrong and display appropriate messages to users.
import { NextResponse } from 'next/server';
import { z } from 'zod';
const CreatePostSchema = z.object({
title: z.string().min(5, 'Title must be at least 5 characters.'),
content: z.string().min(10, 'Content must be at least 10 characters.'),
authorId: z.string().uuid('Author ID must be a valid UUID.'),
});
export async function POST(request: Request) {
try {
const body = await request.json();
const validatedData = CreatePostSchema.parse(body);
console.log('Received valid post data:', validatedData);
return NextResponse.json(
{ message: 'Post created successfully', data: validatedData },
{ status: 201 }
);
} catch (error) {
// Catch ZodError specifically for validation failures
if (error instanceof z.ZodError) {
console.error('Validation failed:', error.errors);
return NextResponse.json(
{ message: 'Validation failed', errors: error.errors },
{ status: 400 }
);
}
// Handle other unexpected errors
console.error('Server error:', error);
return NextResponse.json(
{ message: 'Internal server error' },
{ status: 500 }
);
}
}Beyond Validation: Sanitization
While validation checks if data is *correct*, sanitization cleans or modifies data to remove potentially harmful elements. This is especially important for text inputs that will be displayed in a browser.
For example, removing HTML tags from user-submitted comments helps prevent Cross-Site Scripting (XSS) attacks, where malicious scripts could be injected and executed in other users' browsers.
General API Security Best Practices
Beyond input validation and sanitization, consider these practices for robust API security:
- Use HTTPS: Encrypt all communication.
- Implement Authentication & Authorization: Ensure only legitimate, authorized users can access specific endpoints.
- Rate Limiting: Prevent abuse and brute-force attacks by limiting the number of requests a client can make over time.
- CORS Policies: Configure Cross-Origin Resource Sharing (CORS) headers to control which domains can access your API.
- Error Hiding: Avoid revealing sensitive information in error messages (e.g., stack traces).
Validation Quick Check
You're building a Next.js API route to receive user sign-up data. Which of the following is the most critical reason to perform server-side input validation, even if client-side validation is already in place?
Recap: Validate & Secure Your APIs
Great job! You've learned the importance of input validation and security for Next.js API routes.
- Always validate server-side to protect your application.
- Zod is a powerful tool for defining and enforcing data schemas.
- Handle validation errors gracefully with
400 Bad Requestresponses. - Remember to sanitize inputs and follow general API security best practices.
These steps are fundamental to building robust and secure fullstack Next.js applications!
Często zadawane pytania
Czy lekcja „Walidacja żądań i bezpieczeństwo” jest bezpłatna?
Tak — pełny tekst „Walidacja żądań i bezpieczeństwo” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Next.js 15 Fullstack Web Apps, przejdź na CoddyKit PRO. Kurs Next.js 15 Fullstack Web Apps zawiera 4 lekcji w sumie.
Co nauczysz się w „Walidacja żądań i bezpieczeństwo”?
Implementuj walidację danych wejściowych i zabezpieczaj trasy API przed typowymi podatnościami. Ćwiczysz Next.js 15 Fullstack Web Apps z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Next.js 15 Fullstack Web Apps?
Nie wymagamy żadnego doświadczenia. Next.js 15 Fullstack Web Apps w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Walidacja żądań i bezpieczeństwo”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Next.js 15 Fullstack Web Apps?
Tak. Każda lekcja Next.js 15 Fullstack Web Apps zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Tworzenie procedur obsługi tras API
- Walidacja żądań i bezpieczeństwo
- Integracja usług zewnętrznych
- Ograniczanie częstotliwości żądań i obsługa błędów API