URL 驗證需在前端即時提示與後端嚴格把關雙層防護。本文提供現代化正則模式、PHP 內建過濾器、可達性檢測等多維度方案。
const URL_REGEX = /^https?:\/\/(?:(?:[A-Z0-9-]+\.)+[A-Z]{2,}|localhost|\d{1,3}(?:\.\d{1,3}){3})(?::\d+)?(?:\/[^\s]*)?$/i;
function isValidUrl(url) {
return URL_REGEX.test(url);
}
// 使用新版 URL API(更語義化、自動解析組件)
function isValidUrlModern(url) {
try {
const u = new URL(url);
return u.protocol === 'http:' || u.protocol === 'https:';
} catch {
return false;
}
}
<form id="urlForm">
<input type="url" id="urlInput" placeholder="https://example.com" required>
<button type="submit">提交</button>
</form>
<script>
document.getElementById('urlForm').addEventListener('submit', e => {
e.preventDefault();
const url = document.getElementById('urlInput').value.trim();
if (!isValidUrlModern(url)) {
alert('請輸入合法的 HTTP/HTTPS 網址');
return;
}
// 送後端...
});
</script>
function isValidUrlPHP(string $url): bool {
return filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED) !== false;
}
function isValidUrlRegex(string $url): bool {
$pattern = '/^https?:\/\/(?:(?:[A-Z0-9-]+\.)+[A-Z]{2,}|localhost|\d{1,3}(?:\.\d{1,3}){3})(?::\d+)?(?:\/[^\s]*)?$/i';
return (bool)preg_match($pattern, $url);
}
function isUrlReachable(string $url, int $timeout = 5): bool {
$ctx = stream_context_create([
'http' => ['timeout' => $timeout, 'method' => 'HEAD'],
'ssl' => ['verify_peer' => false, 'verify_peer_name' => false] // 僅測試用
]);
@$headers = get_headers($url, 1, $ctx);
return $headers && strpos($headers[0], '200') !== false;
}
驗證碼通常流程:
/captcha/image 獲取圖片與 Token{token, code} 送後端驗證// 後端簡易示例
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input = strtoupper($_POST['captcha'] ?? '');
$stored = $_SESSION['captcha_code'] ?? '';
echo json_encode(['valid' => $input === $stored]);
unset($_SESSION['captcha_code']); // 一次性
exit;
}
HTML5 <input type="url"> + URL API 做即時提示。filter_var 做基礎格式校驗,業務需要時再做可達性檢測(異步隊列)。HTTP_REFERER,它可被偽造/攔截,不可作為安全依據。htmlspecialchars 編碼。