How to Fix Sensitive Data Exposure in ASP.NET
Learn how to prevent and fix Sensitive Data Exposure vulnerabilities in ASP.NET applications. Step-by-step guide with code examples, security checklists, and best practices.
What Is Sensitive Data Exposure?
Sensitive Data Exposure occurs when an application fails to adequately protect sensitive information during storage, transit, or processing. This includes personal data (names, emails, addresses), financial data (credit card numbers, bank accounts), health information, authentication credentials, API keys, and encryption keys.
The vulnerability manifests in many ways: transmitting data in clear text (HTTP instead of HTTPS); storing sensitive data unencrypted; using weak cryptographic algorithms; exposing API keys or secrets in client-side code or version control; including sensitive data in URLs or logs; caching sensitive responses; and leaking information through error messages, metadata, or timing attacks.
In modern JavaScript applications, a particularly common form of sensitive data exposure is accidentally including server-side secrets in client-side bundles. Environment variables prefixed with `NEXT_PUBLIC_` in Next.js or `VITE_` in Vite are embedded in the client bundle. Developers sometimes expose database URLs, service account keys, or internal API endpoints this way. Similarly, returning full database records (including sensitive fields) from API routes when the client only needs a subset of the data is a common oversight.
Why It Matters
Data exposure can lead to identity theft, financial fraud, and regulatory penalties. Under GDPR, organizations can face fines up to 4% of annual global turnover for data protection failures. HIPAA violations can result in fines up to $1.5 million per incident. Beyond regulatory consequences, data breaches severely damage user trust and brand reputation. Exposed credentials and API keys can be used to compromise connected systems, escalating the impact far beyond the initial exposure. Leaked secrets in public repositories are automatically harvested by bots within minutes.
How to Fix It in ASP.NET
Classify data by sensitivity and apply appropriate protection for each level. Encrypt all data in transit using TLS 1.2+ (enforce HTTPS everywhere). Encrypt sensitive data at rest using AES-256 or equivalent. Never store sensitive data you do not need -- minimize data collection. Never expose secrets in client-side code or version control. Use environment variables for all secrets and rotate them regularly. Implement proper access controls on API responses -- only return the fields the client needs. Use Supabase RLS to enforce data access at the database level. Add secret scanning to your CI/CD pipeline (e.g., GitGuardian, truffleHog). Hash passwords with bcrypt/Argon2 and never store them as plain text.
ASP.NET-Specific Advice
- Razor syntax auto-encodes output by default. Never use `@Html.Raw()` with unsanitized user content.
- Use Entity Framework with LINQ queries or parameterized SQL. Never use string interpolation in `FromSqlRaw()` calls.
- ASP.NET includes anti-forgery token validation. Use `[ValidateAntiForgeryToken]` on all POST actions and include `@Html.AntiForgeryToken()` in forms.
- Use Data Annotations (`[Required]`, `[StringLength]`, `[RegularExpression]`) and `ModelState.IsValid` for input validation.
ASP.NET Security Checklist for Sensitive Data Exposure
ASP.NET Security Best Practices
Razor syntax auto-encodes output by default. Never use `@Html.Raw()` with unsanitized user content.
Use Entity Framework with LINQ queries or parameterized SQL. Never use string interpolation in `FromSqlRaw()` calls.
ASP.NET includes anti-forgery token validation. Use `[ValidateAntiForgeryToken]` on all POST actions and include `@Html.AntiForgeryToken()` in forms.
Use Data Annotations (`[Required]`, `[StringLength]`, `[RegularExpression]`) and `ModelState.IsValid` for input validation.
Use ASP.NET Identity for authentication with proper password hashing (PBKDF2 by default). Never implement custom password storage.
Configure HTTPS redirection and HSTS in `Program.cs`. Use `app.UseHttpsRedirection()` and `app.UseHsts()` in production.
Use `[Authorize]` attributes and policy-based authorization for route-level and action-level access control.
Implement rate limiting using ASP.NET Core's built-in `RateLimiter` middleware (available from .NET 7+).
Scan Your ASP.NET App with SafeVibe
Stop guessing if your ASP.NET app is vulnerable to Sensitive Data Exposure. Run an automated penetration test in minutes and get actionable results.
Start Free Scan