开发者常用小工具速查:URL、Base64、时间戳、Cron、HTTP 与 Markdown
本文目录
URL 编解码、Base64、时间戳、Cron 和 Markdown 表格适合做成打开就能用的小工具,但按钮不能代替对格式和协议的理解。本文按常见误区给出安全边界、可复制的最小例子和排查顺序。在线工具应尽量在浏览器本地完成,不要把 token、Cookie、生产请求或个人数据粘贴到陌生网站。
URL:编码一个组件,不要改写整条地址
URL 有 scheme、host、path、query、fragment 等结构。构造查询参数优先用 URL 和 URLSearchParams:它们会处理参数分隔和百分号编码。encodeURIComponent() 适合编码单个参数值;不要对整条 URL 再编码,也不要对已编码值反复解码。双重编码会让空格、斜杠、百分号和中文在代理、网关、应用之间产生不同解释。
const url = new URL("https://example.test/search");
url.searchParams.set("q", "你好 & Web");
url.searchParams.set("page", "2");
console.log(url.toString());
console.log(url.searchParams.get("q"));
表单编码中的 + 常表示空格;decodeURIComponent("a+b") 则保留加号。判断输入是完整 URL、单个 query value、application/x-www-form-urlencoded 还是路径片段,再选解析方法。用户可控的返回地址必须校验同源或明确 allowlist,解码不是安全验证。
Base64:字节表示,不是加密
Base64 把字节映射为可打印字符,不提供机密性、完整性或身份验证。任何拿到编码串的人都可以解码;不要把密码、令牌、私钥或个人信息“Base64 加密”。还要区分原始字节和 UTF-8 文本:btoa() 接受的是每字符不超过一个字节的二进制字符串,直接传中文可能抛 InvalidCharacterError。
现代浏览器可用 TextEncoder 先把 Unicode 转成 UTF-8 字节;支持环境也可检查 Uint8Array.prototype.toBase64(),但上线前要核对目标浏览器。兼容旧浏览器时要分块处理大数组,避免一次展开大量字节导致参数数量过大。Base64URL 还会改变 +、/ 并可能移除 padding,不能与普通 Base64 不加区分地混用。
时间戳:先确认单位,再讨论时区
JavaScript Date.now() 返回毫秒;很多接口和日志使用秒。把秒误当毫秒会落在 1970 年附近,把毫秒误当秒则超出有效日期范围。时间戳表示一个时刻,时区影响的是展示和日历规则;排查前端与后端相差 8 小时时,先核对输入单位、UTC 时间和显示时区,不要只给数字加减固定小时。
const seconds = Math.floor(Date.now() / 1000);
const milliseconds = Date.now();
const asUtc = new Date(milliseconds).toISOString();
解析用户输入时检查空值、有限数字和合理范围;非 ISO 字符串的解析可能受浏览器实现影响。业务日期(例如某地当天的账期)不能简单等同于 UTC 日期字符串。
Cron:表达式之外还要写时区和失败策略
常见的五段格式为“分 时 日 月 周”,例如 0 9 * * 1-5 表示周一到周五的 09:00,但执行时区由运行环境和调度器配置决定。某些系统 crontab 还需要用户名字段;Quartz、Node 定时库和云调度器也可能采用六/七段格式、不同的星期编号或扩展语法。
上线前核对具体调度器的语法版本、时区、夏令时跳时/重叠时段、机器时钟、并发重入与补跑规则。把调度函数设计为幂等,记录计划时间、实际开始/结束、结果和失败原因;不要只凭一个“下一次执行时间”就认定任务可靠。
HTTP 状态码:413 不等于“前端限制”
400:请求语法或参数不符合接口约定;具体字段要看响应体和服务日志。401:当前请求缺少或没有有效身份凭据;按协议和接口约定处理认证挑战。403:服务端理解请求但拒绝执行;可能是权限策略,不应简单重试登录。404:目标不存在,某些服务也会用它隐藏资源是否存在。409:与资源当前状态冲突;客户端常需要刷新状态后由用户决定。413(RFC 9110 中为 Content Too Large):请求体超过链路中某一层愿意处理的大小。检查反向代理、API 网关、应用 body parser、上传中间件和存储限制,逐层对照实际请求是否到达;只调浏览器不能解除服务端上限。429:触发速率限制;若响应包含Retry-After,遵守等待时间并加入退避,避免重试风暴。502/503/504:从入口、上游健康、连接建立和超时配置逐层定位;这三个状态不能互相替代。
CORS 是浏览器读取跨源响应的策略,不是身份验证或访问控制。命令行 curl 不受浏览器 CORS 检查影响;接口在浏览器报 CORS 错,并不能说明服务端授权安全。
Markdown:源文本、解析器和 HTML 是三件事
Markdown 预览显示出 #,首先检查页面是不是展示了源文本、内容是否放进代码块、解析器有没有加载、预览是不是用了正确字段。不能用正则替代完整 Markdown 语法解析:标题、引用、列表、缩进代码和围栏代码都存在上下文规则。编辑器与阅读页还要使用兼容的扩展集合,避免一边支持表格而另一边不支持。
渲染不可信的 Markdown 时要明确 raw HTML 策略,并使用维护中的 allowlist HTML sanitizer;Markdown 解析本身不等于 XSS 防护。链接应限制危险协议,图片/iframe/视频嵌入按产品允许列表处理。预览要区分渲染视图和原始 Markdown 视图,测试围栏代码、中文标题、表格、链接、HTML、空内容和超长段落。
表格与 CSS 阴影:先生成,再人工检查
表格生成器可以快速搭出表头和分隔线,但列数必须与每行一致;单元格内出现管道符 | 时需要按目标 Markdown 方言转义。表格太宽时,优先调整列数或内容,不要让手机整页横向溢出。
CSS box-shadow 可由水平/垂直偏移、模糊、扩散、颜色和 inset 组成。阴影生成器只适合找起点:检查页面的层级和背景对比,避免大范围重阴影、裁剪容器中的阴影截断,以及只靠颜色传达焦点。动效和 hover 应保留键盘焦点状态。
排障时的最小记录
使用这些小工具排查问题时,留下可复现上下文:原始输入的格式(先脱敏)、运行时/浏览器与版本、期望结果、实际结果、请求状态码和时间。Cron 加上时区和目标调度器;时间戳注明秒或毫秒;Base64 注明普通或 URL-safe;Markdown 注明解析器及扩展;上传错误记录文件大小和每层 HTTP 响应。这样下一位维护者不需要猜。
官方参考
- MDN URL API 与 URLSearchParams:结构化解析和 query 参数处理。
- MDN Base64 指南 与
btoa():字节、Unicode 与二进制字符串边界。 - MDN Date:时间值与日期表示。
- RFC 9110 HTTP Semantics:状态码与
Retry-After语义。 - Linux crontab(5):五段规则、CRON_TZ 和夏令时边界;其他调度器要查自己的文档。
- CommonMark 规范 与 DOMPurify 文档:Markdown 语法和 HTML 清理是不同步骤。
Live Notes
留言提交后会先进入审核,审核通过后对其他读者公开。