无服务器 自建短链服务 Url-Shorten-Worker API不公开服务
源码:
https://github.com/crazypeace/Url-Shorten-Worker
搭建方法:
https://zelikk.blogspot.com/2022/07/url-shorten-worker-hide-tutorial.html
API不公开服务的修改思路:
gh-pages分支下
index.html增加一个保存密钥的文本框, 在html文件中, 设置此文本框的值为__PASSWORD__
<input type="text" class="form-password" value="__PASSWORD__" readonly="true" id="passwordText">
main.js准备给POST的JSON里面添加这个文本框的值
body: JSON.stringify({ url: document.querySelector("#text").value, customShortURL: document.querySelector("#customShortURL").value, password: document.querySelector("#passwordText").value })
准备放到worker的脚本
在返回index.html时,获取index.html后,替换__PASSWORD__为密钥
let index= await fetch("https://crazypeace.github.io/Url-Shorten-Worker/"+config.theme+"/index.html")index=await index.text()index=index.replace(/__PASSWORD__/gm, password_value)return new Response(index, {headers: {"content-type": "text/html;charset=UTF-8",},})
获取POST过来的数据
let req_password=req["password"]
增加验证密钥的处理, 如果API POST过来的密钥不对, 报错
if (req_password != password_value) {return new Response(`{"status":500,"key":": Error: Invalid password."}`, {headers: response_header,})}
整个系统运行逻辑为:
worker脚本当需要返回使用界面时, 读取index.html文件内容, 从KV中读取密钥, 将index.html中的"__PASSWORD__"替换为密钥, 再返回给用户的浏览器显示. 这样用户的页面上, 密钥文本框中的值就是密钥, 而不是"__PASSWORD__"
当用户点击按钮提交POST时, 从密钥文本框中读取密钥, 添加到POST的JSON数据中.
worker脚本当收到POST时, 验证提交的密钥是否符合KV中的密钥, 否则报错.
整个系统的安全性
整个系统的源码和逻辑都可以公开给攻击者。如果攻击者不能拿到Cloudflare的账户权限去读取KV的话,只能暴力破解密码。所以整个系统的安全性来自于密钥的长度。
评论
发表评论