前端怎么安全地验证用户输入的URL参数?
我正在做一个带分享功能的页面,URL里会带一个 redirect 参数,比如 ?redirect=https://example.com。但直接拿这个参数跳转感觉不安全,怕被用来做钓鱼或者 XSS。我试过用 new URL() 解析一下,但还是不确定要不要在前端做更多校验?
现在代码是这样:
<script>
const urlParams = new URLSearchParams(window.location.search);
const redirectUrl = urlParams.get('redirect');
if (redirectUrl) {
// 直接跳转?总觉得不安全
window.location.href = redirectUrl;
}
</script>
有没有靠谱的前端验证方式?还是说这种参数根本不能信,必须后端处理?
前端能做的基础验证:
但说实话,前端验证也就防防小白。开发者工具改一下参数就能绕过,最靠谱的还是后端处理。
如果你用WordPress的话,wp_validate_redirect 这个函数就是专门干这个的,内部已经实现了白名单机制,直接套用就行:
$redirect = isset($_GET['redirect']) ? $_GET['redirect'] : '';
$safe_redirect = wp_validate_redirect($redirect, home_url());
if ($safe_redirect) {
wp_redirect($safe_redirect);
exit;
}
后端验证完了把安全的URL传给前端,或者直接后端301重定向,都比前端裸奔强多了。