From 945bab04bf60f1d5fa45cfc527cf9a107f7495d7 Mon Sep 17 00:00:00 2001
From: Miracle575 <longsijie@icode.pku.edu.cn>
Date: Sat, 25 Nov 2023 06:02:43 +0000
Subject: [PATCH 1/8] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20callbackUrl=20?=
 =?UTF-8?q?=E6=9C=AA=E8=BD=AC=E4=B9=89=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 apps/auth/views/login.liquid       | 4 ++--
 apps/auth/views/otp/bindOtp.liquid | 6 +++---
 apps/auth/views/otp/qrcode.liquid  | 2 +-
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/apps/auth/views/login.liquid b/apps/auth/views/login.liquid
index 32a6c7e704..8ed26851cd 100644
--- a/apps/auth/views/login.liquid
+++ b/apps/auth/views/login.liquid
@@ -97,7 +97,7 @@
               {% endif %}
 
               <input type="hidden" name="token" value="{{ token }}" />
-              <input type="hidden" name="callbackUrl" value="{{ callbackUrl }}" />
+              <input type="hidden" name="callbackUrl" value="{{ callbackUrl | escape }}" />
 
               {% if err %}
                 <p class="my-4 text-center text-red-600">{{ authTexts.login.invalidInput }}</p>
@@ -116,7 +116,7 @@
                 <button type="submit" name="action" value="bindOtp" class="px text-gray-400">
                   {{ authTexts.login.bindOtp }}
                 </button>
-                <input type="hidden" name="callbackUrl" value="{{ callbackUrl }}" />
+                <input type="hidden" name="callbackUrl" value="{{ callbackUrl | escape }}" />
               </form>
             </div>
           {% endif %}
diff --git a/apps/auth/views/otp/bindOtp.liquid b/apps/auth/views/otp/bindOtp.liquid
index 2344cc22dc..ed7844be9c 100644
--- a/apps/auth/views/otp/bindOtp.liquid
+++ b/apps/auth/views/otp/bindOtp.liquid
@@ -23,7 +23,7 @@
               <button type="submit" name="action" value="backToLoginUI" class="text-x text-gray-500 mr-4">
                 {{ authTexts.bindOtp.returnLogin }}
               </button>
-              <input type="hidden" name="callbackUrl" value="{{ callbackUrl }}">
+              <input type="hidden" name="callbackUrl" value="{{ callbackUrl | escape }}">
             </form>
           </div>
         {% unless bindLimitMinutes %}
@@ -53,7 +53,7 @@
                 {{ authTexts.bindOtp.confirm }}
             </button>
           </div>
-          <input type="hidden" name="callbackUrl" value="{{ callbackUrl }}">
+          <input type="hidden" name="callbackUrl" value="{{ callbackUrl | escape }}">
         </form>
 
         {%  else %}
@@ -113,7 +113,7 @@
           </div>
           <input type="hidden" name="otpSessionToken" value="{{ otpSessionToken }}" />
           <input type="hidden" name="emailAddress" value="{{ emailAddress }}" />
-          <input type="hidden" name="callbackUrl" value="{{ callbackUrl }}">
+          <input type="hidden" name="callbackUrl" value="{{ callbackUrl | escape }}">
         </form>
         {% endunless %}
         </div>
diff --git a/apps/auth/views/otp/qrcode.liquid b/apps/auth/views/otp/qrcode.liquid
index e543e1601c..e84ebb0e76 100644
--- a/apps/auth/views/otp/qrcode.liquid
+++ b/apps/auth/views/otp/qrcode.liquid
@@ -4,5 +4,5 @@
   <input
     type="hidden"
     name="callbackUrl"
-    value="{{ callbackUrl }}">
+    value="{{ callbackUrl | escape }}">
 </div>

From 85ba9476d80fb35f1c0e7ded6ca825b1ab4a667b Mon Sep 17 00:00:00 2001
From: Miracle575 <longsijie@icode.pku.edu.cn>
Date: Sat, 25 Nov 2023 06:24:30 +0000
Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20changeset=20?=
 =?UTF-8?q?=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .changeset/perfect-dodos-jam.md | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 .changeset/perfect-dodos-jam.md

diff --git a/.changeset/perfect-dodos-jam.md b/.changeset/perfect-dodos-jam.md
new file mode 100644
index 0000000000..5efdf9a247
--- /dev/null
+++ b/.changeset/perfect-dodos-jam.md
@@ -0,0 +1,5 @@
+---
+"@scow/auth": patch
+---
+
+修复 callbackUrl 未转义的问题

From cb805b1f5287bea7843817379d0f959d8042f437 Mon Sep 17 00:00:00 2001
From: Miracle575 <longsijie@icode.pku.edu.cn>
Date: Sat, 25 Nov 2023 06:54:28 +0000
Subject: [PATCH 3/8] =?UTF-8?q?fix:=20host=20=E5=A4=B4=E6=94=BB=E5=87=BB?=
 =?UTF-8?q?=E6=BC=8F=E6=B4=9E?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 apps/cli/assets/install.yaml   | 3 +++
 apps/cli/src/compose/index.ts  | 1 +
 apps/cli/src/config/install.ts | 5 +++++
 apps/gateway/assets/nginx.conf | 2 ++
 apps/gateway/src/env.ts        | 2 ++
 5 files changed, 13 insertions(+)

diff --git a/apps/cli/assets/install.yaml b/apps/cli/assets/install.yaml
index 88f6e6cff5..606ed39d06 100644
--- a/apps/cli/assets/install.yaml
+++ b/apps/cli/assets/install.yaml
@@ -129,6 +129,9 @@
 #             include includes/headers;
 #             include includes/websocket;
 #          }
+#   # 允许访问的域名或 IP,多个域名或 IP 间用空格隔开
+#   # 默认接受所有域名和 IP,"_" 即表示接受所有域名和 IP
+#   allowedServerName: "_"
 
 # 插件配置
 # plugins:
diff --git a/apps/cli/src/compose/index.ts b/apps/cli/src/compose/index.ts
index 26b7e04fbd..3349015cef 100644
--- a/apps/cli/src/compose/index.ts
+++ b/apps/cli/src/compose/index.ts
@@ -126,6 +126,7 @@ export const createComposeSpec = (config: InstallConfigSchema) => {
       "PUBLIC_PATH": publicPath,
       "PUBLIC_DIR": publicDir,
       "EXTRA": config.gateway.extra,
+      "ALLOWED_SERVER_NAME": config.gateway.allowedServerName,
     },
     ports: { [config.port]: 80 },
     volumes: {
diff --git a/apps/cli/src/config/install.ts b/apps/cli/src/config/install.ts
index f215722737..0a22ce6e5e 100644
--- a/apps/cli/src/config/install.ts
+++ b/apps/cli/src/config/install.ts
@@ -45,6 +45,11 @@ export const InstallConfigSchema = Type.Object({
       description: "更多nginx配置,可接受的格式为nginx的server可接受的属性配置,可增加在当前系统nginx端口(默认80)的服务等",
       default: "",
     }),
+
+    allowedServerName: Type.String({
+      description: "允许访问的域名或 IP",
+      default: "_",
+    }),
   }, { default: {} }),
 
   portal: Type.Optional(Type.Object({
diff --git a/apps/gateway/assets/nginx.conf b/apps/gateway/assets/nginx.conf
index 0e12dc0804..38ec9aef03 100644
--- a/apps/gateway/assets/nginx.conf
+++ b/apps/gateway/assets/nginx.conf
@@ -1,5 +1,7 @@
 server {
 
+  server_name ${server_name};
+
   resolver ${RESOLVER} valid=10s;
   resolver_timeout 5s;
 
diff --git a/apps/gateway/src/env.ts b/apps/gateway/src/env.ts
index 18993d5e82..342b9859d2 100644
--- a/apps/gateway/src/env.ts
+++ b/apps/gateway/src/env.ts
@@ -35,5 +35,7 @@ export const config = envConfig({
 
   PUBLIC_DIR: str({ desc: "静态文件在文件系统中的路径。以/结尾", default: "/app/apps/gateway/public/" }),
   PUBLIC_PATH: str({ desc: "静态文件路径前缀。以/开头,以/结尾", default: "/__public__/" }),
+
+  ALLOWED_SERVER_NAME: str({ desc: "允许访问的域名或 IP,多个域名和 IP 间用空格隔开", default: "_" }),
 });
 

From 7b65dcdd4e3102b1f0ecc5bb4c141b9bf9bc600b Mon Sep 17 00:00:00 2001
From: Miracle575 <longsijie@icode.pku.edu.cn>
Date: Sat, 25 Nov 2023 07:15:04 +0000
Subject: [PATCH 4/8] fix: nginx error

---
 apps/gateway/assets/nginx.conf | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/gateway/assets/nginx.conf b/apps/gateway/assets/nginx.conf
index 38ec9aef03..1487b60784 100644
--- a/apps/gateway/assets/nginx.conf
+++ b/apps/gateway/assets/nginx.conf
@@ -1,6 +1,6 @@
 server {
 
-  server_name ${server_name};
+  server_name ${ALLOWED_SERVER_NAME};
 
   resolver ${RESOLVER} valid=10s;
   resolver_timeout 5s;

From e637809b0bbf17cfa4128ee8f9e8f8569a4d2899 Mon Sep 17 00:00:00 2001
From: Miracle575 <longsijie@icode.pku.edu.cn>
Date: Sat, 25 Nov 2023 08:05:20 +0000
Subject: [PATCH 5/8] =?UTF-8?q?feat:=20=E5=BD=93=20server=5Fname=20?=
 =?UTF-8?q?=E4=B8=8D=E4=B8=BA=20=5F=20=E6=B7=BB=E5=8A=A0=E9=BB=98=E8=AE=A4?=
 =?UTF-8?q?=20server=20=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 apps/cli/src/compose/index.ts  | 5 +++++
 apps/gateway/assets/nginx.conf | 2 ++
 apps/gateway/src/env.ts        | 6 +++++-
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/apps/cli/src/compose/index.ts b/apps/cli/src/compose/index.ts
index 3349015cef..5ee39cf6a9 100644
--- a/apps/cli/src/compose/index.ts
+++ b/apps/cli/src/compose/index.ts
@@ -113,6 +113,10 @@ export const createComposeSpec = (config: InstallConfigSchema) => {
   const publicPath = "/__public__/";
   const publicDir = "/app/apps/gateway/public/";
 
+  const defaultServerBlock = `server {
+    listen 80 default_server;
+    return 444;
+  }`;
   // GATEWAY
   addService("gateway", {
     image: scowImage,
@@ -127,6 +131,7 @@ export const createComposeSpec = (config: InstallConfigSchema) => {
       "PUBLIC_DIR": publicDir,
       "EXTRA": config.gateway.extra,
       "ALLOWED_SERVER_NAME": config.gateway.allowedServerName,
+      "DEFAULT_SERVER_BLOCK": config.gateway.allowedServerName === "_" ? "" : defaultServerBlock,
     },
     ports: { [config.port]: 80 },
     volumes: {
diff --git a/apps/gateway/assets/nginx.conf b/apps/gateway/assets/nginx.conf
index 1487b60784..b823bc0cae 100644
--- a/apps/gateway/assets/nginx.conf
+++ b/apps/gateway/assets/nginx.conf
@@ -62,3 +62,5 @@ server {
 
   ${EXTRA}
 }
+
+${DEFAULT_SERVER_BLOCK}
diff --git a/apps/gateway/src/env.ts b/apps/gateway/src/env.ts
index 342b9859d2..f340725ec3 100644
--- a/apps/gateway/src/env.ts
+++ b/apps/gateway/src/env.ts
@@ -36,6 +36,10 @@ export const config = envConfig({
   PUBLIC_DIR: str({ desc: "静态文件在文件系统中的路径。以/结尾", default: "/app/apps/gateway/public/" }),
   PUBLIC_PATH: str({ desc: "静态文件路径前缀。以/开头,以/结尾", default: "/__public__/" }),
 
-  ALLOWED_SERVER_NAME: str({ desc: "允许访问的域名或 IP,多个域名和 IP 间用空格隔开", default: "_" }),
+  ALLOWED_SERVER_NAME: str({ desc: "允许访问的域名或 IP,多个域名和 IP 间用空格隔开", default: "a" }),
+  DEFAULT_SERVER_BLOCK: str({ desc: "当配置了ALLOWED_SERVER_NAME为特定IP或域名时,设置默认服务块拒绝其他访问", default: `server {
+    listen 80 default_server;
+    return 444;
+  }` }),
 });
 

From ce6cea48e56ef4bc9eaf87ada9daf162427eff06 Mon Sep 17 00:00:00 2001
From: Miracle575 <longsijie@icode.pku.edu.cn>
Date: Sat, 25 Nov 2023 08:34:30 +0000
Subject: [PATCH 6/8] fix: test error

---
 apps/gateway/src/env.ts | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/apps/gateway/src/env.ts b/apps/gateway/src/env.ts
index f340725ec3..ebc44ad0cd 100644
--- a/apps/gateway/src/env.ts
+++ b/apps/gateway/src/env.ts
@@ -36,10 +36,7 @@ export const config = envConfig({
   PUBLIC_DIR: str({ desc: "静态文件在文件系统中的路径。以/结尾", default: "/app/apps/gateway/public/" }),
   PUBLIC_PATH: str({ desc: "静态文件路径前缀。以/开头,以/结尾", default: "/__public__/" }),
 
-  ALLOWED_SERVER_NAME: str({ desc: "允许访问的域名或 IP,多个域名和 IP 间用空格隔开", default: "a" }),
-  DEFAULT_SERVER_BLOCK: str({ desc: "当配置了ALLOWED_SERVER_NAME为特定IP或域名时,设置默认服务块拒绝其他访问", default: `server {
-    listen 80 default_server;
-    return 444;
-  }` }),
+  ALLOWED_SERVER_NAME: str({ desc: "允许访问的域名或 IP,多个域名和 IP 间用空格隔开", default: "_" }),
+  DEFAULT_SERVER_BLOCK: str({ desc: "当配置了ALLOWED_SERVER_NAME为特定IP或域名时,设置默认服务块拒绝其他访问", default: "" }),
 });
 

From d13cde3fa33163d5eb1b8b28df7f556b4d970223 Mon Sep 17 00:00:00 2001
From: Miracle575 <longsijie@icode.pku.edu.cn>
Date: Sat, 25 Nov 2023 09:09:50 +0000
Subject: [PATCH 7/8] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=20changeset=20?=
 =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=B9=B6=E6=96=B0=E5=A2=9E=E6=96=87=E6=A1=A3?=
 =?UTF-8?q?=E8=AF=B4=E6=98=8E?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .changeset/perfect-dodos-jam.md               |  5 ----
 .changeset/seven-glasses-rest.md              |  8 ++++++
 .../deploy/config/gateway/config/index.md     | 27 ++++++++++++++-----
 3 files changed, 28 insertions(+), 12 deletions(-)
 delete mode 100644 .changeset/perfect-dodos-jam.md
 create mode 100644 .changeset/seven-glasses-rest.md

diff --git a/.changeset/perfect-dodos-jam.md b/.changeset/perfect-dodos-jam.md
deleted file mode 100644
index 5efdf9a247..0000000000
--- a/.changeset/perfect-dodos-jam.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@scow/auth": patch
----
-
-修复 callbackUrl 未转义的问题
diff --git a/.changeset/seven-glasses-rest.md b/.changeset/seven-glasses-rest.md
new file mode 100644
index 0000000000..d2b327962b
--- /dev/null
+++ b/.changeset/seven-glasses-rest.md
@@ -0,0 +1,8 @@
+---
+"@scow/gateway": minor
+"@scow/cli": minor
+"@scow/docs": minor
+"@scow/auth": patch
+---
+
+修复 scow 存在的 web 安全漏洞
diff --git a/docs/docs/deploy/config/gateway/config/index.md b/docs/docs/deploy/config/gateway/config/index.md
index 124d7b1be2..0e509021b8 100644
--- a/docs/docs/deploy/config/gateway/config/index.md
+++ b/docs/docs/deploy/config/gateway/config/index.md
@@ -15,15 +15,28 @@ title: 配置
 ```yaml title="install.yml"
 # 网关配置
 gateway:
-   # 更多nginx配置
-    extra: >
-        location /extra {
-            proxy_pass http://extra-web:3000;
-            include includes/headers;
-            include includes/websocket;
-         }
+  # 更多nginx配置
+  extra: >
+      location /extra {
+          proxy_pass http://extra-web:3000;
+          include includes/headers;
+          include includes/websocket;
+        }
 ```
 
 您增加`extra`配置后,可以在使用`./cli compose up -d`启动scow后,使用 ` ./cli compose exec gateway sh` 进入gateway服务,在 `/etc/nginx/http.d` 目录下的 `default.conf` 文件最下方查看到您添加的配置。
 如果gateway服务启动失败,说明您的配置不符合规范,请保证其正确性。
 
+## 域名白名单配置
+
+scow 网关默认接收来自所有域名的访问
+为了防止 host 头攻击的发生。所以可以通过设置域名白名单来限制可访问的域名或 IP
+
+```
+gateway:
+  # 更多nginx配置
+  allowedServerName: example.com www.example.com
+```
+
+多个域名或 IP 间用空格间隔即可。
+

From 4fb67f25bbbe8e89669df0ea9c9f8769352633b5 Mon Sep 17 00:00:00 2001
From: Miracle575 <longsijie@icode.pku.edu.cn>
Date: Sun, 26 Nov 2023 10:02:02 +0000
Subject: [PATCH 8/8] =?UTF-8?q?docs:=20=E4=BF=AE=E6=94=B9=E6=96=87?=
 =?UTF-8?q?=E6=A1=A3=E8=AF=B4=E6=98=8E?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 docs/docs/deploy/config/gateway/config/index.md | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/docs/docs/deploy/config/gateway/config/index.md b/docs/docs/deploy/config/gateway/config/index.md
index 0e509021b8..5319593627 100644
--- a/docs/docs/deploy/config/gateway/config/index.md
+++ b/docs/docs/deploy/config/gateway/config/index.md
@@ -29,12 +29,13 @@ gateway:
 
 ## 域名白名单配置
 
-scow 网关默认接收来自所有域名的访问
-为了防止 host 头攻击的发生。所以可以通过设置域名白名单来限制可访问的域名或 IP
+scow 网关默认不限制 HTTP Host 头
+
+为了防止 host 头攻击的发生,可以通过设置域名白名单来限制 Host 的域名或 IP
 
 ```
 gateway:
-  # 更多nginx配置
+  # 同 nginx server_name 配置
   allowedServerName: example.com www.example.com
 ```