输入校验是指验证来自用户的输入数据是否符合预期格式与范围的过程。它是 XSS、SQL 注入、命令注入等众多 Web 攻击的第一道防线。
输入校验有两种思路:白名单方式 (定义允许的模式,拒绝其余全部) 与黑名单方式 (定义禁止的模式,允许其余全部) 。从安全的角度看,白名单方式具有压倒性的推荐度。因为黑名单方式难以穷举攻击模式,面对新的攻击手法会变得脆弱。
在短链接服务中,对用户输入的 URL 进行校验尤为重要。应当验证的项目包括:URL 的格式是否正确 (是否符合 RFC 3986) ;协议是否为 `http://` 或 `https://` (排除 `javascript:` 方案) ;域名是否被列入黑名单 (排除钓鱼站点) ;以及 URL 的长度是否在上限之内。由于允许 `javascript:` 方案的 URL 就会导致 XSS 攻击成立,因此对协议做白名单校验是必须的。
校验必须在客户端 (浏览器) 与服务器端两侧都实施,这是铁律。客户端校验的目的是提升用户体验 (即时反馈) ,并不构成安全上的防御。由于攻击者能够轻易绕过浏览器的校验,所以服务器端的验证不可或缺。