Encoding and Escaping Strategies

Encoding and Escaping Strategies

When validation alone isn't sufficient, proper encoding prevents injection:

class SafeEncoder {
    // HTML encoding for output
    public static function htmlEncode($input) {
        return htmlspecialchars($input, ENT_QUOTES | ENT_HTML5, 'UTF-8');
    }
    
    // JavaScript encoding for dynamic content
    public static function jsEncode($input) {
        $escaped = json_encode($input, JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS);
        return substr($escaped, 1, -1); // Remove quotes added by json_encode
    }
    
    // URL encoding for parameters
    public static function urlEncode($input) {
        return rawurlencode($input);
    }
    
    // SQL identifier escaping (when parameterization isn't possible)
    public static function escapeIdentifier($identifier, $allowedChars = 'a-zA-Z0-9_') {
        // Only allow whitelisted characters
        if (!preg_match("/^[$allowedChars]+$/", $identifier)) {
            throw new InvalidArgumentException("Invalid identifier format");
        }
        
        // Additional length check
        if (strlen($identifier) > 64) {
            throw new InvalidArgumentException("Identifier too long");
        }
        
        // Quote identifier for MySQL
        return '`' . str_replace('`', '``', $identifier) . '`';
    }
    
    // Safe filename generation
    public static function sanitizeFilename($filename) {
        // Remove path traversal attempts
        $filename = basename($filename);
        
        // Replace dangerous characters
        $filename = preg_replace('/[^a-zA-Z0-9._-]/', '_', $filename);
        
        // Ensure it doesn't start with a dot (hidden file)
        $filename = ltrim($filename, '.');
        
        // Limit length
        if (strlen($filename) > 255) {
            $extension = pathinfo($filename, PATHINFO_EXTENSION);
            $name = pathinfo($filename, PATHINFO_FILENAME);
            $name = substr($name, 0, 250 - strlen($extension));
            $filename = $name . '.' . $extension;
        }
        
        return $filename ?: 'unnamed';
    }
}

Input validation must be applied consistently at all application entry points. Remember that client-side validation improves user experience but provides no security—all validation must be repeated server-side. Combine validation with parameterized queries, proper encoding, and other security measures for comprehensive protection against SQL injection.