Skip to content

Commit 40a75fd

Browse files
authored
Merge pull request #9406 from JarLob/controller
Extend aspnetcore controller definition
2 parents 0581b91 + 57fcfd5 commit 40a75fd

File tree

6 files changed

+158
-2
lines changed

6 files changed

+158
-2
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* ASP.NET Core controller definition has been made more precise. The amount of introduced taint sources or eliminated false positives should be low though, since the most common pattern is to derive all user defined ASP.NET Core controllers from the standard Controller class, which is not affected.

csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,13 @@ class MicrosoftAspNetCoreMvcNonActionAttribute extends MicrosoftAspNetCoreMvcAtt
6262
MicrosoftAspNetCoreMvcNonActionAttribute() { this.getType().hasName("NonActionAttribute") }
6363
}
6464

65+
/** A `Microsoft.AspNetCore.Mvc.NonController` attribute. */
66+
class MicrosoftAspNetCoreMvcNonControllerAttribute extends MicrosoftAspNetCoreMvcAttribute {
67+
MicrosoftAspNetCoreMvcNonControllerAttribute() {
68+
this.getType().hasName("NonControllerAttribute")
69+
}
70+
}
71+
6572
/** The `Microsoft.AspNetCore.Antiforgery` namespace. */
6673
class MicrosoftAspNetCoreAntiforgeryNamespace extends Namespace {
6774
MicrosoftAspNetCoreAntiforgeryNamespace() {
@@ -182,10 +189,38 @@ class MicrosoftAspNetCoreMvcControllerBaseClass extends Class {
182189
}
183190
}
184191

185-
/** A subtype of `Microsoft.AspNetCore.Mvc.Controller` or `Microsoft.AspNetCore.Mvc.ControllerBase`. */
192+
/**
193+
* A valid ASP.NET Core controller according to:
194+
* https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/actions?view=aspnetcore-3.1
195+
* https://github.com/dotnet/aspnetcore/blob/b3c93967ba508b8ef139add27132d9483c1a9eb4/src/Mvc/Mvc.Core/src/Controllers/ControllerFeatureProvider.cs#L39-L75
196+
*/
186197
class MicrosoftAspNetCoreMvcController extends Class {
187198
MicrosoftAspNetCoreMvcController() {
188-
this.getABaseType*() instanceof MicrosoftAspNetCoreMvcControllerBaseClass
199+
(
200+
exists(Assembly a |
201+
a.getName() = ["Microsoft.AspNetCore.Mvc.Core", "Microsoft.AspNetCore.Mvc.ViewFeatures"]
202+
) or
203+
exists(UsingNamespaceDirective ns |
204+
ns.getImportedNamespace() instanceof MicrosoftAspNetCoreMvcNamespace
205+
)
206+
) and
207+
this.isPublic() and
208+
(not this.isAbstract() or this instanceof MicrosoftAspNetCoreMvcControllerBaseClass) and
209+
not this instanceof Generic and
210+
(
211+
this.getABaseType*() instanceof MicrosoftAspNetCoreMvcControllerBaseClass
212+
or
213+
this.getABaseType*().getName().matches("%Controller")
214+
or
215+
this.getABaseType*()
216+
.getAnAttribute()
217+
.getType()
218+
.getABaseType*()
219+
// ApiControllerAttribute is derived from ControllerAttribute
220+
.hasQualifiedName("Microsoft.AspNetCore.Mvc.ControllerAttribute")
221+
) and
222+
not this.getABaseType*().getAnAttribute() instanceof
223+
MicrosoftAspNetCoreMvcNonControllerAttribute
189224
}
190225

191226
/** Gets an action method for this controller. */
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
using Microsoft.AspNetCore.Mvc;
2+
3+
// has sufix "Controller"
4+
public class HomeController
5+
{
6+
public string Index()
7+
{
8+
return "This is Home Controller";
9+
}
10+
}
11+
12+
// derived from Microsoft.AspNetCore.Mvc.Controller which has suffix "Controller"
13+
public class HomeController1 : Controller
14+
{
15+
public string Index()
16+
{
17+
return "This is Home Controller";
18+
}
19+
}
20+
21+
// derived from Microsoft.AspNetCore.Mvc.ControllerBase which has attribute [Microsoft.AspNetCore.Mvc.Controller]
22+
public class HomeController2 : ControllerBase
23+
{
24+
public string Index()
25+
{
26+
return "This is Home Controller";
27+
}
28+
}
29+
30+
// has [ApiController] attribute
31+
[ApiController]
32+
public class HomeController3
33+
{
34+
public string Index()
35+
{
36+
return "This is Home Controller";
37+
}
38+
}
39+
40+
// has [Controller] attribute
41+
[Controller]
42+
public class HomeController4
43+
{
44+
public string Index()
45+
{
46+
return "This is Home Controller";
47+
}
48+
}
49+
50+
// derived from a class that is a controller
51+
public class HomeController5 : HomeController4
52+
{
53+
public string Index()
54+
{
55+
return "This is Home Controller";
56+
}
57+
}
58+
59+
// is not public
60+
internal class NotHomeController : Controller
61+
{
62+
public string Index()
63+
{
64+
return "This is Home Controller";
65+
}
66+
}
67+
68+
// is abstract
69+
public abstract class NotHomeController2 : Controller
70+
{
71+
public string Index()
72+
{
73+
return "This is Home Controller";
74+
}
75+
}
76+
77+
// contains generic parameters
78+
public class NotHomeController3<T> : Controller
79+
{
80+
public string Index()
81+
{
82+
return "This is Home Controller";
83+
}
84+
}
85+
86+
// has [NonController] attribute
87+
[NonController]
88+
public class NotHomeController4 : Controller
89+
{
90+
public string Index()
91+
{
92+
return "This is Home Controller";
93+
}
94+
}
95+
96+
// derived from a class that has [NonController] attribute
97+
public class NotController : NotHomeController4
98+
{
99+
public string Index()
100+
{
101+
return "This is Home Controller";
102+
}
103+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
| AspNetCore.cs:4:14:4:27 | HomeController |
2+
| AspNetCore.cs:13:14:13:28 | HomeController1 |
3+
| AspNetCore.cs:22:14:22:28 | HomeController2 |
4+
| AspNetCore.cs:32:14:32:28 | HomeController3 |
5+
| AspNetCore.cs:42:14:42:28 | HomeController4 |
6+
| AspNetCore.cs:51:14:51:28 | HomeController5 |
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import csharp
2+
import semmle.code.csharp.frameworks.microsoft.AspNetCore
3+
4+
from MicrosoftAspNetCoreMvcController c
5+
where c.fromSource()
6+
select c
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj
2+
semmle-extractor-options: /nostdlib /noconfig

0 commit comments

Comments
 (0)