|
@@ -5,7 +5,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
## 项目概述
|
|
## 项目概述
|
|
|
|
|
|
|
|
CJYDocs 是一个基于 Node.js + Express 的轻量级 Markdown 文档管理和渲染系统,采用前后端分离架构。核心特点包括:
|
|
CJYDocs 是一个基于 Node.js + Express 的轻量级 Markdown 文档管理和渲染系统,采用前后端分离架构。核心特点包括:
|
|
|
-- 🔐 **登录认证系统** - 基于 express-session 的会话管理,7天免登录
|
|
|
|
|
|
|
+- 🔐 **登录认证系统** - 基于 Cookie 令牌的轻量认证,7天免登录
|
|
|
- 通过解析 `index.md` 配置文件实现文档的层级化管理
|
|
- 通过解析 `index.md` 配置文件实现文档的层级化管理
|
|
|
- 支持在线编辑功能,智能光标定位
|
|
- 支持在线编辑功能,智能光标定位
|
|
|
- 全文搜索、TOC 目录、响应式设计
|
|
- 全文搜索、TOC 目录、响应式设计
|
|
@@ -132,40 +132,41 @@ const DOM = {
|
|
|
**安全机制**:
|
|
**安全机制**:
|
|
|
- 所有文档和图片 API 都需要登录认证(`requireAuth` 中间件)
|
|
- 所有文档和图片 API 都需要登录认证(`requireAuth` 中间件)
|
|
|
- 用户输入经过 `sanitizePath()` 清理和 `validatePath()` 验证,防止路径遍历攻击
|
|
- 用户输入经过 `sanitizePath()` 清理和 `validatePath()` 验证,防止路径遍历攻击
|
|
|
-- Session 配置为 HttpOnly Cookie,防止 XSS 攻击
|
|
|
|
|
|
|
+- 认证令牌通过 HttpOnly Cookie 存储(`cjydocs.token`),防止 XSS 攻击
|
|
|
|
|
|
|
|
**缓存策略**:
|
|
**缓存策略**:
|
|
|
-`index.md` 解析结果缓存5秒(`server.js:14-16`),减少文件系统读取频率。
|
|
|
|
|
|
|
+`index.md` 解析结果缓存5秒(`server.js:31-33`),减少文件系统读取频率。
|
|
|
|
|
|
|
|
### 关键功能实现
|
|
### 关键功能实现
|
|
|
|
|
|
|
|
-#### 0. 登录认证系统
|
|
|
|
|
-`server.js:10-167` - 完整的会话管理和认证系统:
|
|
|
|
|
|
|
+#### 0. 登录认证系统 (Cookie 令牌)
|
|
|
|
|
+`server.js:5-195` - 基于 Cookie 令牌的认证系统:
|
|
|
|
|
|
|
|
**认证流程**:
|
|
**认证流程**:
|
|
|
```
|
|
```
|
|
|
-用户访问 / 或 /reader.html → 检查 session.isAuthenticated
|
|
|
|
|
|
|
+用户访问 / 或 /reader.html → 检查 `cjydocs.token` Cookie 是否匹配固定令牌
|
|
|
↓ (未登录)
|
|
↓ (未登录)
|
|
|
重定向到 /login.html
|
|
重定向到 /login.html
|
|
|
↓
|
|
↓
|
|
|
用户输入密码 → POST /api/login
|
|
用户输入密码 → POST /api/login
|
|
|
↓
|
|
↓
|
|
|
-验证密码 (cjy@0526) → 创建 session
|
|
|
|
|
|
|
+验证密码 (cjy@0526) → 设置 token Cookie
|
|
|
↓
|
|
↓
|
|
|
重定向到首页 → 可以访问所有文档
|
|
重定向到首页 → 可以访问所有文档
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-**Session 配置** (`server.js:48-61`):
|
|
|
|
|
|
|
+**Token Cookie 配置** (`server.js:14-21`):
|
|
|
|
|
+- Cookie 名称: `cjydocs.token`
|
|
|
- 有效期: 7天 (`maxAge: 7 * 24 * 60 * 60 * 1000`)
|
|
- 有效期: 7天 (`maxAge: 7 * 24 * 60 * 60 * 1000`)
|
|
|
-- Cookie 名称: `cjydocs.sid`
|
|
|
|
|
- HttpOnly: true (防止 XSS)
|
|
- HttpOnly: true (防止 XSS)
|
|
|
- SameSite: lax (允许合理的跨站请求)
|
|
- SameSite: lax (允许合理的跨站请求)
|
|
|
-- Rolling: true (每次请求重置过期时间)
|
|
|
|
|
|
|
+- Secure: false (生产环境应启用 HTTPS 并设为 true)
|
|
|
|
|
+- Path: `/`
|
|
|
|
|
|
|
|
-**认证中间件** (`server.js:64-76`):
|
|
|
|
|
|
|
+**认证中间件** (`server.js:118-131`):
|
|
|
```javascript
|
|
```javascript
|
|
|
function requireAuth(req, res, next) {
|
|
function requireAuth(req, res, next) {
|
|
|
- if (req.session && req.session.isAuthenticated) {
|
|
|
|
|
|
|
+ if (isAuthenticated(req)) {
|
|
|
return next();
|
|
return next();
|
|
|
}
|
|
}
|
|
|
// API 请求返回 401,页面请求重定向
|
|
// API 请求返回 401,页面请求重定向
|
|
@@ -180,6 +181,10 @@ function requireAuth(req, res, next) {
|
|
|
- 硬编码在 `server.js:11` (`PASSWORD = 'cjy@0526'`)
|
|
- 硬编码在 `server.js:11` (`PASSWORD = 'cjy@0526'`)
|
|
|
- 生产环境建议改用环境变量: `process.env.PASSWORD`
|
|
- 生产环境建议改用环境变量: `process.env.PASSWORD`
|
|
|
|
|
|
|
|
|
|
+**令牌配置**:
|
|
|
|
|
+- 固定令牌在 `server.js:5` (`SECERT_TOKEN = 'cjy123'`)
|
|
|
|
|
+- Cookie 名称与参数在 `TOKEN_COOKIE_NAME/TOKEN_COOKIE_OPTIONS`
|
|
|
|
|
+
|
|
|
#### 1. Markdown 渲染
|
|
#### 1. Markdown 渲染
|
|
|
使用 `marked.js` + `highlight.js`,配置在 `reader.js:25-38`
|
|
使用 `marked.js` + `highlight.js`,配置在 `reader.js:25-38`
|
|
|
|
|
|
|
@@ -268,7 +273,7 @@ saveDocument() → PUT /api/doc/:category/:docName
|
|
|
```
|
|
```
|
|
|
cjydocs/
|
|
cjydocs/
|
|
|
├── server.js # Express 后端(499行)
|
|
├── server.js # Express 后端(499行)
|
|
|
-│ # - 登录认证和会话管理
|
|
|
|
|
|
|
+│ # - 登录认证 (Cookie 令牌)
|
|
|
│ # - 所有 API 端点(GET/PUT/POST)
|
|
│ # - 所有 API 端点(GET/PUT/POST)
|
|
|
│ # - index.md 解析逻辑(带5秒缓存)
|
|
│ # - index.md 解析逻辑(带5秒缓存)
|
|
|
│ # - 安全验证函数(sanitizePath, validatePath)
|
|
│ # - 安全验证函数(sanitizePath, validatePath)
|
|
@@ -335,12 +340,12 @@ cjydocs/
|
|
|
|
|
|
|
|
## 安全注意事项
|
|
## 安全注意事项
|
|
|
|
|
|
|
|
-### 1. 认证和会话安全
|
|
|
|
|
-**Session 配置**:
|
|
|
|
|
|
|
+### 1. 认证和 Cookie 安全
|
|
|
|
|
+**Token Cookie 配置**:
|
|
|
- HttpOnly Cookie - 防止 JavaScript 访问(XSS 防护)
|
|
- HttpOnly Cookie - 防止 JavaScript 访问(XSS 防护)
|
|
|
-- SameSite: lax - 防止 CSRF 攻击
|
|
|
|
|
-- 会话密钥应使用环境变量,不要硬编码
|
|
|
|
|
|
|
+- SameSite: lax - 降低 CSRF 风险
|
|
|
- 生产环境建议启用 HTTPS 并设置 `secure: true`
|
|
- 生产环境建议启用 HTTPS 并设置 `secure: true`
|
|
|
|
|
+- 固定令牌不应硬编码,建议使用环境变量或更安全的签名/随机令牌方案
|
|
|
|
|
|
|
|
**密码安全**:
|
|
**密码安全**:
|
|
|
- 当前使用硬编码密码 `cjy@0526`,仅适用于开发/个人使用
|
|
- 当前使用硬编码密码 `cjy@0526`,仅适用于开发/个人使用
|
|
@@ -398,11 +403,10 @@ if (!validatePath(docPath, docsDir)) {
|
|
|
检查:
|
|
检查:
|
|
|
1. 浏览器是否启用了 Cookie
|
|
1. 浏览器是否启用了 Cookie
|
|
|
2. 浏览器控制台是否有 CORS 错误
|
|
2. 浏览器控制台是否有 CORS 错误
|
|
|
-3. Session 配置是否正确(特别是跨域场景)
|
|
|
|
|
|
|
+3. Cookie 配置是否正确(特别是跨域/HTTPS 场景)
|
|
|
|
|
|
|
|
-#### Session 频繁过期
|
|
|
|
|
-- 检查 `server.js:48-61` 中的 session 配置
|
|
|
|
|
-- `rolling: true` 应该会在每次请求时重置过期时间
|
|
|
|
|
|
|
+#### Cookie 频繁失效
|
|
|
|
|
+- 检查 `server.js:14-21` 中的 `TOKEN_COOKIE_OPTIONS` 配置
|
|
|
- 确保浏览器没有频繁清除 Cookie
|
|
- 确保浏览器没有频繁清除 Cookie
|
|
|
|
|
|
|
|
### 文档显示为空或 404
|
|
### 文档显示为空或 404
|