无服务器 自建短链服务 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的话,只能暴力破解密码。所以整个系统的安全性来自于密钥的长度。



评论

The Hot3 in Last 30 Days