0Pricing
Secure Coding & OWASP Top 10 for Backend · 课时

全面的输入验证策略

开发健壮的输入验证流程,包括白名单、规范化和严格的数据类型强制,以消除各种基于输入的攻击。

全面的输入验证策略 是 CoddyKit 上的免费 Secure Coding & OWASP Top 10 for Backend 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Secure Coding & OWASP Top 10 for Backend 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Secure Coding & OWASP Top 10 for Backend 课程共包含 4 节课。

本课时的部分内容尚未翻译,以英文显示。

Why Validate Input?

Input validation is the process of ensuring that data provided by a user or another system conforms to expected formats and constraints.

It's your first and most critical line of defense against many types of attacks, like injection, buffer overflows, and even simple logic errors.

Always assume external input is malicious until proven otherwise!

Whitelisting for Safety

When validating input, the safest approach is whitelisting. This means you define what is explicitly allowed, and reject everything else.

  • Whitelisting: "Only these characters/patterns are allowed."
  • Blacklisting: "These characters/patterns are forbidden."

Blacklisting is dangerous because attackers often find ways around forbidden patterns. Whitelisting is proactive and far more secure.

Simple Whitelist Check

Here's a simple Java example of whitelisting allowed characters for a username. Only letters, numbers, and underscore are permitted.

public class InputValidator {
  public static boolean isValidUsername(String username) {
    if (username == null || username.isEmpty()) {
      return false;
    }
    // Whitelist: only letters, numbers, and underscore
    return username.matches("^[a-zA-Z0-9_]+$");
  }

  public static void main(String[] args) {
    String user1 = "coddy_kit_123";
    String user2 = "bad user!";
    String user3 = "admin";

    System.out.println("User '" + user1 + "' is valid: " + isValidUsername(user1));
    System.out.println("User '" + user2 + "' is valid: " + isValidUsername(user2));
    System.out.println("User '" + user3 + "' is valid: " + isValidUsername(user3));
  }
}

Normalize Your Inputs

Canonicalization (or normalization) is the process of converting input data into a standard, simplified, or "canonical" form before validation.

This is crucial because attackers often try to bypass validation by encoding input in different ways (e.g., %2F for /, & for &). Canonicalization ensures all variations are reduced to a common representation.

Canonicalization in Action

This Java snippet shows how you might canonicalize a path by decoding URL encoding and simplifying path components (e.g., removing /./ or /../ if allowed, though typically ../ should be blocked).

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;

public class PathCanonicalizer {
  public static String canonicalizePath(String path) {
    try {
      // 1. URL Decode the path
      String decodedPath = URLDecoder.decode(path, StandardCharsets.UTF_8.name());
      
      // 2. Normalize path separators (e.g., replace backslashes with forward slashes)
      decodedPath = decodedPath.replace("\\", "/");
      
      // 3. Remove redundant path elements (e.g., /./)
      decodedPath = decodedPath.replace("/./", "/");
      
      // Note: Full path traversal prevention requires more complex logic
      // and often involves resolving the path against a base directory.
      
      return decodedPath;
    } catch (Exception e) {
      return null; // Handle decoding errors
    }
  }

  public static void main(String[] args) {
    String input1 = "/usr/local/%2E%2E/etc/passwd";
    String input2 = "/app/data/./report.txt";

    System.out.println("Original: " + input1 + "\nCanonical: " + canonicalizePath(input1));
    System.out.println("\nOriginal: " + input2 + "\nCanonical: " + canonicalizePath(input2));
  }
}

Enforce Data Types

Beyond character sets, validating the data type of input is essential. If you expect an integer, ensure it's an integer. If you expect a boolean, ensure it's true or false.

Incorrect data types can lead to:

  • Application crashes
  • Unexpected behavior
  • Security vulnerabilities (e.g., type juggling attacks in some languages)

Type Check Example

This Java example demonstrates how to parse a string into an integer safely, catching potential NumberFormatExceptions.

public class DataTypeEnforcer {
  public static Integer parseIntegerSafely(String input) {
    if (input == null || input.trim().isEmpty()) {
      return null; // Or throw an IllegalArgumentException
    }
    try {
      return Integer.parseInt(input.trim());
    } catch (NumberFormatException e) {
      System.err.println("Error: '" + input + "' is not a valid integer.");
      return null; // Indicate failure
    }
  }

  public static void main(String[] args) {
    String validNum = "12345";
    String invalidNum = "abc";
    String negativeNum = "-50";

    System.out.println("Parsed '" + validNum + "': " + parseIntegerSafely(validNum));
    System.out.println("Parsed '" + invalidNum + "': " + parseIntegerSafely(invalidNum));
    System.out.println("Parsed '" + negativeNum + "': " + parseIntegerSafely(negativeNum));
  }
}

Limit & Format

Input validation also includes checking the length and format of data:

  • Length Validation: Prevent excessively long inputs that could cause buffer overflows or denial-of-service attacks. Set minimum and maximum lengths.
  • Format Validation: Use regular expressions (regex) to ensure input matches specific patterns, like email addresses, phone numbers, or UUIDs.

Combine these with whitelisting for robust checks.

Server-Side is Key

Remember, client-side validation (in the browser) is only for user experience. Attackers can easily bypass it.

All critical input validation must occur on the server-side. This ensures that even if a malicious user bypasses client-side checks, your backend remains secure.

Never trust input coming from the client!

Validate Your Knowledge

Which of the following are recommended best practices for comprehensive input validation?

Summary of Validation

In this lesson, we explored comprehensive input validation strategies:

  • Always use whitelisting to define what's allowed.
  • Perform canonicalization to normalize input and defeat encoding tricks.
  • Enforce strict data types to prevent unexpected behavior.
  • Validate length and format using regex.
  • Crucially, always perform validation on the server-side.

Robust input validation is a cornerstone of secure backend development!

常见问题解答

「全面的输入验证策略」课时是免费的吗?

是的 — 「全面的输入验证策略」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Secure Coding & OWASP Top 10 for Backend 课程的其余内容,请升级到 CoddyKit PRO。 Secure Coding & OWASP Top 10 for Backend 课程共包含 4 节课。

「全面的输入验证策略」这节课中我会学到什么?

开发健壮的输入验证流程,包括白名单、规范化和严格的数据类型强制,以消除各种基于输入的攻击。 你通过在浏览器中直接运行的动手代码来练习 Secure Coding & OWASP Top 10 for Backend,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Secure Coding & OWASP Top 10 for Backend 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Secure Coding & OWASP Top 10 for Backend 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「全面的输入验证策略」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Secure Coding & OWASP Top 10 for Backend 课中编写并运行代码吗?

能。每节 Secure Coding & OWASP Top 10 for Backend 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 高级 SQLi 与 NoSQLi 技术
  2. 全面的输入验证策略
  3. 后端的内容安全策略(CSP)
  4. 防止命令注入与 LDAP 注入
← 返回 Secure Coding & OWASP Top 10 for Backend