jackseceng/LinkShort
GitHub: jackseceng/LinkShort
一个以安全设计为核心、集成完整 DevSecOps 流水线的容器化短链接服务,适合学习安全开发和自动化安全检测实践。
Stars: 2 | Forks: 0
# LinkShort
[](https://codeql.github.com/)
[](https://github.com/jackseceng/LinkShort/actions/workflows/container.yml)


这是一个链接缩短 Web 应用的 Python 代码、Web 资产和 Docker 配置
- 在 [cubel.ink](https://cubel.ink) 试用该应用
- 下载 [DockerHub 镜像](https://hub.docker.com/r/jackseceng/linkshort)
我正在使用此仓库学习:
- Docker & Web App Hosting
- Python Web 开发
- DevSecOps 自动化
## 本地测试
以下是在您的机器上本地设置容器以进行测试和开发的说明。
### 数据库
首先,[注册一个免费的 Turso 账户](https://app.turso.tech/signup),并使用以下 SQL 语句创建一个名为 `urls` 的数据库表:
```
CREATE TABLE
urls (
hashsum VARCHAR(64) PRIMARY KEY,
url BLOB,
salt BLOB,
CONSTRAINT unique_hash UNIQUE (hashsum)
);
```
### Captcha & Web 资产存储
首先,[注册一个免费的 Cloudflare 账户](https://dash.cloudflare.com/sign-up)
然后,为您的 TLD 和 localhost 域设置 turnstile widget。
接下来设置 R2 存储,并将您的 TLD 链接到服务以用于生产环境。
设置好存储后,将您的静态 Javascript 和图像资产上传到 bucket 的根目录,确保它们的名称与 HTML 文件头中引用的名称匹配。
如果您修改了静态 Web 文件,请将您的 HTML 指向本地托管的版本,或者使用 AWS CLI 的 sync 命令从仓库根目录手动将更改后的文件上传到 R2 开发 bucket:
```
aws s3 sync app/static s3:// --endpoint-url https://.eu.r2.cloudflarestorage.com
```
或者,如果您在欧盟境外:
```
aws s3 sync app/static s3:// --endpoint-url https://.r2.cloudflarestorage.com
```
### 设置本地环境
您需要在 `/app` 目录中创建一个名为 `.env` 的文件,包含以下内容,并用您自己的替换值设置适当的值:
```
ENDPOINT=""
TOKEN=""
CF_SECRET=""
TLD=localhost
CDN=""
```
**! 警告 !**
`docker-compose.yaml` 和 `.env` 文件必须在适用的地方引用相同的变量名称,此外请确保变量名称未在您的测试环境中的其他地方设置。
### 启动本地实例
从此仓库的根目录运行:
```
docker compose up -d --build
```
```
[+] Running (2/2)
✔ Network linkshort_ls-net Created
✔ Container linkshort-app-1 Started
```
如果成功,应用将在 [http://localhost](http://localhost) 运行,它将通过互联网连接到您的 Turso 数据库。
每当您进行更改时,都可以重新运行此命令以重建容器。
要关闭服务,请运行此命令:
```
docker compose down
```
## 功能
- [x] 使用唯一扩展名缩短 URL
- [x] 加密存储的 URL 以及随机 salt
- [x] 扩展名在数据库中存储为 hashsum
- [x] 对请求中的 URL 和扩展名的用户输入进行清理
- [x] 检查用户共享的 URL,确保它们以 HTTPS 开头
- [x] 使用最小化的 scratch 镜像以保障运行时安全
- [x] 根据垃圾邮件列表检查提交的 URL,拒绝已知的垃圾邮件域名
- [x] 生成供用户下载和分享的 QR 码
- [x] 具有 reactive CSS & HTML 的前端
- [x] 带有页面的 400 和 500 HTTP 错误处理
- [x] 主页上的 Captcha:使用 [Cloudflare Turnstile](https://www.cloudflare.com/en-gb/application-services/products/turnstile/)
- [x] 通过 CDN 提供静态内容:通过 [Cloudflare R2](https://www.cloudflare.com/en-gb/developer-platform/products/r2/) 提供
- [x] 演示应用程序设置:托管在 [cloud.run](https://cloud.run)
- [ ] 用户在主表单中输入的自定义 URL
- [ ] URL 统计页面,用于查看链接获得的点击次数
## DevSecOps
代码 Linting:
- [x] [Super Linter](https://github.com/super-linter/super-linter)
静态 & 软件成分分析:
- [x] [CodeQL](https://codeql.github.com/)
- [x] [Snyk](https://snyk.io)
- [x] [semgrep](https://semgrep.dev/products/semgrep-code/)
容器镜像扫描:
- [x] [Grype](https://github.com/anchore/grype/)
- [x] [Docker Scout](https://docs.docker.com/scout/)
- [x] [Trivy](https://trivy.dev/latest/docs/target/container_image/)
自动化依赖升级:
- [x] [Renovate](https://www.mend.io/free-developer-tools/renovate/)
- [x] [Dependabot](https://github.com/dependabot)
提交标准化:
- [x] [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
## 由 [Jack](https://jacksec.engineer) 开发
标签:AI应用开发, CI/CD安全, Cloudflare R2, Cloudflare Turnstile, CodeQL, DevSecOps, DNS枚举, Docker, GitHub Actions, Llama, NIDS, Python, Turso数据库, URL缩短器, 上游代理, 安全设计, 安全评估工具, 安全防御评估, 容器化, 容器安全扫描, 对象存储, 无后门, 网络安全工具, 自动笔记, 请求拦截, 逆向工具, 防御逃脱, 验证码