DEV Community

Cover image for How to prevent XSS Attacks in ASP.NET Core Web API
ByteHide
ByteHide

Posted on • Edited on • Originally published at bytehide.com

How to prevent XSS Attacks in ASP.NET Core Web API

Cross-site scripting (XSS) may sound like complicated tech jargon, but it’s actually a common problem when building web applications. XSS attacks occur when attackers exploit your app to execute harmful scripts in the browsers of other users.

By the end of this article, you’ll know how to protect your ASP.NET Core Web API from these kinds of attacks through input validation, output encoding, and other best practices. Let’s jump in and make sure your API stays secure!

What is XSS?

Before diving into prevention, it's important to understand XSS, or Cross-Site Scripting. These attacks occur when an attacker injects malicious scripts into webpages. When users visit these affected pages, the scripts execute, potentially stealing data or performing other harmful actions. Here’s a breakdown of common XSS attack types:

Types of XSS Attacks

  1. Stored XSS: Malicious scripts are injected into a data source, like a database. When users access this data, the scripts execute, acting like hidden traps.
  2. Reflected XSS: Scripts are immediately returned to the user from their input, often via tricky links.
  3. DOM-Based XSS: This occurs on the client side, with the script manipulating the browser’s DOM to execute its harmful tasks.

Protecting Your ASP.NET Core API

With an understanding of XSS, let's explore how to safeguard your API using various methods.

Validate Your Inputs

Always validate the inputs to your API, acting like a security gate that only allows valid data through.

public class UserInput
{
    [Required]
    [MaxLength(50)]
    [RegularExpression(@"^[a-zA-Z0-9]*$", ErrorMessage = "Invalid characters in name")]
    public string Name { get; set; }

    [Required]
    [EmailAddress]
    public string Email { get; set; }
}
Enter fullscreen mode Exit fullscreen mode

This code snippet ensures that user inputs meet expected patterns, preventing harmful scripts from sneaking in.

Sanitize Inputs

After validation, sanitizing input data is crucial, functioning as a second check to eliminate lingering threats.

using System.Text.Encodings.Web;

public string SanitizeInput(string input)
{
    return HtmlEncoder.Default.Encode(input);
}
Enter fullscreen mode Exit fullscreen mode

Encoding special characters with this method disarms potential XSS payloads.

Third-Party Libraries for Sanitization

Sometimes in-built tools suffice, but third-party libraries like Ganss.XSS can provide extra safeguards.

// Setup and Use
// Install-Package Ganss.Xss

using Ganss.XSS;

public string SanitizeHtml(string input)
{
    var sanitizer = new HtmlSanitizer();
    return sanitizer.Sanitize(input);
}
Enter fullscreen mode Exit fullscreen mode

Using this library, you can robustly clean inputs and remove undesirable elements.

Advanced Defense Techniques

Beyond sanitizing and validating inputs, additional strategies can further protect your API.

Content Security Policy (CSP)

A CSP defines rules for loading resources, ensuring only trusted sources are used.

public void Configure(IApplicationBuilder app)
{
    app.Use(async (context, next) =>
    {
        context.Response.Headers.Add("Content-Security-Policy", "default-src 'self'; script-src 'self'");
        await next();
    });
}
Enter fullscreen mode Exit fullscreen mode

This configuration restricts script loading, helping to prevent execution of untrusted scripts.

Secure Your Cookies

For APIs using cookies, always mark them as HttpOnly and use Secure, ensuring scripts can’t access session tokens or similar sensitive data.

options.Cookie.HttpOnly = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
Enter fullscreen mode Exit fullscreen mode

These small adjustments can have a significant effect on security.

Practical Example

Here's how these measures can be implemented in an ASP.NET Core application, such as in a commenting feature.

[ApiController]
[Route("api/[controller]")]
public class CommentController : ControllerBase
{
    private readonly HtmlSanitizer _sanitizer;

    public CommentController()
    {
        _sanitizer = new HtmlSanitizer();
    }

    [HttpPost]
    [Route("create")]
    public IActionResult CreateComment([FromBody] Comment comment)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        comment.Content = _sanitizer.Sanitize(comment.Content);
        comment.CreatedAt = DateTime.UtcNow;
        return Ok(new { Message = "Comment created successfully!", SanitizedContent = comment.Content });
    }
}
Enter fullscreen mode Exit fullscreen mode

Through input cleaning and validation, you protect your application and its users from malicious threats.

Conclusion

Being vigilant against XSS is crucial for maintaining user trust and data protection. By embedding these practices into your API development process, you’re establishing a secure application environment. In the ever-evolving cybersecurity landscape, proactive measures are invaluable, so keep security features up-to-date and functioning. Happy coding!

Top comments (1)

Collapse
 
artydev profile image
artydev

Great,

Thank you