Skip to content

Commit f0ecf15

Browse files
committed
JS: Add test with file named 'page'
1 parent e54789d commit f0ecf15

File tree

4 files changed

+35
-6
lines changed

4 files changed

+35
-6
lines changed

javascript/ql/lib/semmle/javascript/frameworks/Next.qll

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,24 @@ module NextJS {
3838
result = appFolder().getAFolder()
3939
}
4040

41+
private Folder pagesFolder() {
42+
result = pagesRoot()
43+
or
44+
result = pagesFolder().getAFolder()
45+
}
46+
4147
/**
4248
* Gets a "pages" folder in a `Next.js` application.
4349
* JavaScript files inside these folders are mapped to routes.
4450
*/
45-
Folder getAPagesFolder() {
46-
result = pagesRoot()
47-
or
48-
result = getAPagesFolder().getAFolder()
49-
}
51+
deprecated predicate getAPagesFolder = pagesFolder/0;
5052

5153
/**
5254
* Gets a module corrosponding to a `Next.js` page.
5355
*/
54-
Module getAPagesModule() { result.getFile().getParentContainer() = getAPagesFolder() }
56+
Module getAPagesModule() {
57+
result.getFile() = [pagesFolder().getAFile(), appFolder().getJavaScriptFile("page")]
58+
}
5559

5660
/**
5761
* Gets a module inside a "pages" folder where `fallback` from `getStaticPaths` is not set to false.

javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXss.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
| app/api/routeNextRequest.ts:15:20:15:23 | body | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | app/api/routeNextRequest.ts:15:20:15:23 | body | Cross-site scripting vulnerability due to a $@. | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | user-provided value |
3636
| app/api/routeNextRequest.ts:27:20:27:23 | body | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | app/api/routeNextRequest.ts:27:20:27:23 | body | Cross-site scripting vulnerability due to a $@. | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | user-provided value |
3737
| app/api/routeNextRequest.ts:31:27:31:30 | body | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | app/api/routeNextRequest.ts:31:27:31:30 | body | Cross-site scripting vulnerability due to a $@. | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | user-provided value |
38+
| app/blah/page.jsx:10:13:10:19 | req.url | app/blah/page.jsx:10:13:10:19 | req.url | app/blah/page.jsx:10:13:10:19 | req.url | Cross-site scripting vulnerability due to a $@. | app/blah/page.jsx:10:13:10:19 | req.url | user-provided value |
39+
| app/blah/page.jsx:17:13:17:19 | req.url | app/blah/page.jsx:17:13:17:19 | req.url | app/blah/page.jsx:17:13:17:19 | req.url | Cross-site scripting vulnerability due to a $@. | app/blah/page.jsx:17:13:17:19 | req.url | user-provided value |
3840
| app/blah/route.ts:3:25:3:27 | url | app/blah/route.ts:2:17:2:23 | req.url | app/blah/route.ts:3:25:3:27 | url | Cross-site scripting vulnerability due to a $@. | app/blah/route.ts:2:17:2:23 | req.url | user-provided value |
3941
| app/pages/Next2.jsx:8:13:8:19 | req.url | app/pages/Next2.jsx:8:13:8:19 | req.url | app/pages/Next2.jsx:8:13:8:19 | req.url | Cross-site scripting vulnerability due to a $@. | app/pages/Next2.jsx:8:13:8:19 | req.url | user-provided value |
4042
| app/pages/Next2.jsx:15:13:15:19 | req.url | app/pages/Next2.jsx:15:13:15:19 | req.url | app/pages/Next2.jsx:15:13:15:19 | req.url | Cross-site scripting vulnerability due to a $@. | app/pages/Next2.jsx:15:13:15:19 | req.url | user-provided value |
@@ -370,6 +372,8 @@ nodes
370372
| app/api/routeNextRequest.ts:15:20:15:23 | body | semmle.label | body |
371373
| app/api/routeNextRequest.ts:27:20:27:23 | body | semmle.label | body |
372374
| app/api/routeNextRequest.ts:31:27:31:30 | body | semmle.label | body |
375+
| app/blah/page.jsx:10:13:10:19 | req.url | semmle.label | req.url |
376+
| app/blah/page.jsx:17:13:17:19 | req.url | semmle.label | req.url |
373377
| app/blah/route.ts:2:11:2:13 | url | semmle.label | url |
374378
| app/blah/route.ts:2:17:2:23 | req.url | semmle.label | req.url |
375379
| app/blah/route.ts:3:25:3:27 | url | semmle.label | url |

javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXssWithCustomSanitizer.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
| app/api/routeNextRequest.ts:15:20:15:23 | body | Cross-site scripting vulnerability due to $@. | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | user-provided value |
3535
| app/api/routeNextRequest.ts:27:20:27:23 | body | Cross-site scripting vulnerability due to $@. | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | user-provided value |
3636
| app/api/routeNextRequest.ts:31:27:31:30 | body | Cross-site scripting vulnerability due to $@. | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | user-provided value |
37+
| app/blah/page.jsx:10:13:10:19 | req.url | Cross-site scripting vulnerability due to $@. | app/blah/page.jsx:10:13:10:19 | req.url | user-provided value |
38+
| app/blah/page.jsx:17:13:17:19 | req.url | Cross-site scripting vulnerability due to $@. | app/blah/page.jsx:17:13:17:19 | req.url | user-provided value |
3739
| app/blah/route.ts:3:25:3:27 | url | Cross-site scripting vulnerability due to $@. | app/blah/route.ts:2:17:2:23 | req.url | user-provided value |
3840
| app/pages/Next2.jsx:8:13:8:19 | req.url | Cross-site scripting vulnerability due to $@. | app/pages/Next2.jsx:8:13:8:19 | req.url | user-provided value |
3941
| app/pages/Next2.jsx:15:13:15:19 | req.url | Cross-site scripting vulnerability due to $@. | app/pages/Next2.jsx:15:13:15:19 | req.url | user-provided value |
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
export default function Page() {
2+
return <span />;
3+
}
4+
5+
Page.getInitialProps = async (ctx) => {
6+
const req = ctx.req;
7+
const res = ctx.res;
8+
res.end(req.url); // $ Alert
9+
return {}
10+
}
11+
12+
export async function getServerSideProps(ctx) {
13+
const req = ctx.req;
14+
const res = ctx.res;
15+
res.end(req.url); // $ Alert
16+
return {
17+
props: {}
18+
}
19+
}

0 commit comments

Comments
 (0)