PHP表单如何校验URL字段是否包含指定域名thisismydomain.com
PHP域名校验逻辑修复方案
原有代码存在的两个核心错误
- 匹配目标字符串多了冗余字符:原代码搜索的内容为
thisismydomain.com"(末尾携带多余双引号),正常用户输入不会包含该字符,导致匹配逻辑完全失效 - 校验逻辑完全倒置:当前规则为「输入包含指定域名则抛出错误」,与需求「仅包含指定域名的输入可通过校验」完全相反
基础修复版代码
直接修复原有问题,满足基础需求:
// 去除输入首尾空白,避免空格导致的误判 $inputUrl = trim($_POST['vurl']); // 不包含指定域名时抛出错误,使用stripos忽略大小写匹配 if (stripos($inputUrl, 'thisismydomain.com') === false) { redirectWithError("请输入合法的URL地址"); }
严谨增强版代码
避免恶意构造的输入绕过校验(比如fake-thisismydomain.com、thisismydomain.com.fake.com这类不符合要求的内容),安全性更高:
$inputUrl = trim($_POST['vurl']); // 无协议前缀时自动补全,保证parse_url可正常解析 if (!str_starts_with($inputUrl, 'http://') && !str_starts_with($inputUrl, 'https://')) { $inputUrl = 'https://' . $inputUrl; } // 提取URL中的域名部分 $host = parse_url($inputUrl, PHP_URL_HOST); // 校验域名是否为指定域名或其子域名 if ($host === false || !str_ends_with($host, 'thisismydomain.com')) { redirectWithError("请输入合法的URL地址"); }
注:
str_starts_with、str_ends_with为PHP8.0及以上版本新增函数,若使用低版本PHP,可做如下替换:
str_starts_with($inputUrl, 'http://')替换为stripos($inputUrl, 'http://') === 0str_ends_with($host, 'thisismydomain.com')替换为stripos($host, 'thisismydomain.com') === strlen($host) - strlen('thisismydomain.com')
内容的提问来源于stack exchange,提问作者Greenreader9
相关产品推荐
相关产品推荐

