Skip to content

Commit 292b807

Browse files
Merge pull request #203 from UWB-ACM/security-changes
Security changes
2 parents 8fbd2b4 + bbf2dc8 commit 292b807

3 files changed

Lines changed: 38 additions & 7 deletions

File tree

next.config.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
import type { NextConfig } from "next";
22

3+
const cspHeader = `
4+
default-src 'self';
5+
script-src 'self'${process.env.NODE_ENV === "development" ? " 'unsafe-eval' 'unsafe-inline'" : ""} https://cdn.strawpoll.com;
6+
style-src 'self' 'unsafe-inline';
7+
img-src 'self' blob: data:;
8+
font-src 'self';
9+
object-src 'none';
10+
base-uri 'self';
11+
form-action 'self';
12+
frame-ancestors 'none';
13+
frame-src https://strawpoll.com;
14+
upgrade-insecure-requests;
15+
`;
16+
317
const nextConfig: NextConfig = {
418
images: {
519
formats: ["image/avif", "image/webp"],
@@ -22,6 +36,19 @@ const nextConfig: NextConfig = {
2236
},
2337
],
2438
},
39+
async headers() {
40+
return [
41+
{
42+
source: "/(.*)",
43+
headers: [
44+
{
45+
key: "Content-Security-Policy",
46+
value: cspHeader.replace(/\n/g, ""),
47+
},
48+
],
49+
},
50+
];
51+
},
2552
};
2653

2754
export default nextConfig;

src/util/logout.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import { buildKey } from "@/src/util/redis";
99
*/
1010
export async function logoutUser() {
1111
const cookieStore = await cookies();
12-
const sessionCookie = cookieStore.get("session-uwbh25");
12+
const sessionCookie = cookieStore.get("__Host-session-uwbh25");
1313

1414
if (sessionCookie?.value) {
1515
await redis.del(buildKey("session", sessionCookie.value));
16-
await cookieStore.delete("session-uwbh25");
16+
cookieStore.delete("__Host-session-uwbh25");
1717

1818
console.log("User logged out successfully.");
1919
}

src/util/session.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export interface Session {
5353
export async function getSession(): Promise<Session> {
5454
const cookieStore = await cookies();
5555

56-
const cookie = cookieStore.get("session-uwbh25");
56+
const cookie = cookieStore.get("__Host-session-uwbh25");
5757
if (!cookie?.value) {
5858
console.error("No session cookie found.");
5959
return {};
@@ -73,7 +73,7 @@ export async function getSession(): Promise<Session> {
7373
* Ensures that a request/response has a session
7474
*/
7575
export async function ensureSession(req: NextRequest, res: NextResponse) {
76-
const cookie = req.cookies.get("session-uwbh25");
76+
const cookie = req.cookies.get("__Host-session-uwbh25");
7777

7878
// If we have a cookie, ensure that it points to a valid session.
7979
// Otherwise, create a new one.
@@ -99,15 +99,19 @@ export async function ensureSession(req: NextRequest, res: NextResponse) {
9999
const expiresAt = new Date(Date.now() + sessionTimeSeconds * 1000);
100100

101101
res.cookies.set({
102-
name: "session-uwbh25",
102+
name: "__Host-session-uwbh25",
103103
value: newSessionId,
104104
expires: expiresAt,
105+
httpOnly: true,
106+
secure: true,
107+
sameSite: "strict",
105108
});
106109

107110
// Also set the request header so that any server
108111
// side code has the right session ID.
112+
// This doesn't write any cookies.
109113
req.cookies.set({
110-
name: "session-uwbh25",
114+
name: "__Host-session-uwbh25",
111115
value: newSessionId,
112116
});
113117
}
@@ -121,7 +125,7 @@ export async function ensureSession(req: NextRequest, res: NextResponse) {
121125
export async function saveSession(data: Session): Promise<void> {
122126
const cookieStore = await cookies();
123127

124-
const cookie = cookieStore.get("session-uwbh25");
128+
const cookie = cookieStore.get("__Host-session-uwbh25");
125129
if (!cookie?.value) {
126130
// This shouldn't happen, since every user should
127131
// have a session.

0 commit comments

Comments
 (0)