| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
|
QHelp previews: csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.qhelpMissing clickjacking protectionWeb sites that do not restrict framing using the X-Frame-Options HTTP header or the frame-ancestors Content Security Policy directive may be vulnerable to UI redress attacks ("clickjacking"). In these attacks, the vulnerable site is loaded in a frame on an attacker-controlled site which uses opaque or transparent layers to trick the user into unintentionally clicking a button or link on the vulnerable site. RecommendationSet the X-Frame-Options HTTP header to DENY, to instruct web browsers to block attempts to load the site in a frame. Alternatively, if framing is needed in certain circumstances, specify SAMEORIGIN to permit framing by the same origin. The frame-ancestors directive in an enforced Content-Security-Policy header provides a more flexible alternative. For example, use frame-ancestors 'none' to prevent all framing, or use its source list to specify which origins may embed the application. For ASP.NET Framework applications, the header may be specified either in the Web.config file, using the <customHeaders> tag, or within the source code of the application using the HttpResponse.AddHeader method. In general, prefer specifying the header in the Web.config file to ensure it is added to all requests. If adding it to the source code, ensure that it is added unconditionally to all requests. For example, add the header in the Application_BeginRequest method in the global.asax file. For ASP.NET Core applications, set the header on HttpResponse.Headers. This can be done using the header dictionary's indexer or its Append, Add, or TryAdd methods. ExampleThe following example shows how to specify the X-Frame-Options header within the Web.config file for ASP.NET: <?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
</system.web>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-Frame-Options" value="SAMEORIGIN" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
This next example shows how to specify the X-Frame-Options header within the global.asax file for an ASP.NET application: protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.AddHeader("X-Frame-Options", "DENY");
}The following ASP.NET Core example uses an enforced Content Security Policy to disallow framing: void Configure(IApplicationBuilder app)
{
app.Use(async (context, next) =>
{
context.Response.Headers["Content-Security-Policy"] = "frame-ancestors 'none'";
await next();
});
}References
|
Sorry, something went wrong.
There was a problem hiding this comment.
Thank you very much for doing this! It would be great, if we can eliminate some false positives!
I have added some initial comments.
Starting our internal DCA testing of the query as well.
Sorry, something went wrong.
There was a problem hiding this comment.
The CSP matcher accepts empty frame-ancestors directives that browsers do not enforce.
Get a fresh assessment by requesting another Copilot review.
Pull request overviewExtends the C# missing clickjacking protection query to recognize ASP.NET Core response headers and enforced CSP frame-ancestors directives.
Changes:
| File | Description |
|---|---|
| WebConfigAddedHeaderInLocation/MissingXFrameOptions.qlref | Uses direct query expectations. |
| WebConfigAddedHeader/Web.config | Tests case-insensitive X-Frame-Options. |
| WebConfigAddedHeader/PrefixedCsp.Web.config | Tests unsupported prefixed CSP. |
| WebConfigAddedHeader/MissingXFrameOptions.qlref | Uses direct query expectations. |
| WebConfigAddedHeader/MissingXFrameOptions.expected | Records negative CSP cases. |
| WebConfigAddedHeader/CspSubstring.Web.config | Tests directive substring rejection. |
| WebConfigAddedHeader/Csp.Web.config | Tests valid case-insensitive CSP. |
| NoHeader/MissingXFrameOptions.expected | Updates the alert message. |
| HeaderWrites/Web.config | Provides an unprotected test configuration. |
| HeaderWrites/options | Loads ASP.NET Core stubs. |
| HeaderWrites/MissingXFrameOptions.qlref | Runs the production query. |
| HeaderWrites/MissingXFrameOptions.expected | Expects production-query suppression. |
| HeaderWrites/HeaderWrites.qlref | Configures inline-expectation testing. |
| HeaderWrites/HeaderWrites.ql | Exposes recognized header writes. |
| HeaderWrites/HeaderWrites.expected | Records recognized write expressions. |
| HeaderWrites/HeaderWrites.cs | Tests supported and ignored header writes. |
| CodeAddedHeader/MissingXFrameOptions.qlref | Uses direct query expectations. |
| MissingXFrameOptionsLib.qll | Implements header and CSP recognition. |
| MissingXFrameOptionsAspNetCore.cs | Adds an ASP.NET Core help example. |
| MissingXFrameOptions.ql | Integrates broader clickjacking protection detection. |
| MissingXFrameOptions.qhelp | Documents CSP and ASP.NET Core usage. |
| 2026-09-10-missing-x-frame-options.md | Adds the analysis change note. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
Summary
The cs/web/missing-x-frame-options query was primarily modeled around legacy ASP.NET Framework applications hosted by IIS. As a result, it could report false positives for ASP.NET Core applications that correctly configure clickjacking-related response headers in code.
This change:
Legacy ASP.NET Framework and Web.config handling remains supported.
Testing