应通过五种方法防范dns重绑定攻击:一、验证请求主机名白名单;二、实施dns解析结果校验;三、禁用危险协议与限制请求目标;四、配置web服务器默认虚拟主机拦截;五、启用dns固定策略。

如果您在PHP应用中接收来自外部的域名请求,但未对域名解析结果进行校验,则可能遭受DNS重绑定攻击。攻击者可利用短TTL DNS记录诱导服务端多次解析同一域名并返回不同IP,从而绕过白名单机制访问内部资源。以下是防止该攻击的多种方法:
一、验证请求主机名白名单
强制限制HTTP请求中Host头或请求域名仅允许预设的合法域名,拒绝任何未授权域名的访问,从根本上阻断恶意域名注入路径。
1、在Laravel中间件中定义允许的主机名数组,如['example.com', 'www.example.com']。
2、使用$request->getHost()获取当前请求Host头值。
3、通过in_array()判断该Host是否存在于白名单中。
4、若不匹配,立即调用abort(403, 'Unauthorized domain access')终止请求。
二、实施DNS解析结果校验
在服务端主动对客户端传入的域名执行DNS解析,并比对解析所得IP是否属于预期范围,防止攻击者通过DNS动态响应将域名解析至内网地址。
1、调用gethostbyname($domain)获取域名对应的IPv4地址。
2、使用filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)排除私有IP和保留IP。
3、若校验失败,拒绝该域名后续所有处理逻辑。
4、对关键接口(如回调地址、Webhook目标)强制执行此校验步骤。
三、禁用危险协议与限制请求目标
防止攻击者在参数中构造非HTTP协议或内网地址,避免PHP函数(如curl_exec、file_get_contents)被用于发起SSRF式内网探测请求。
1、在URL参数解析阶段,使用parse_url()提取scheme字段。
2、明确限定仅允许http和https协议,拒绝dict://、gopher://、file://、ftp://等非常规协议。
3、对解析出的host字段再次执行DNS解析,并校验其IP是否落入192.168.0.0/16、10.0.0.0/8、172.16.0.0/12等私有地址段。
4、若命中私有IP段,直接抛出异常或返回400错误。
四、配置Web服务器默认虚拟主机拦截
在Nginx或Apache层面拦截未显式声明的域名请求,避免恶意绑定域名直接进入PHP应用层,减少攻击面。
1、在Nginx配置中定义default_server虚拟主机块。
2、设置listen指令包含default_server参数,例如listen 80 default_server。
3、在该server块中配置return 444;指令,使未匹配任何域名的请求直接关闭连接。
4、确保该配置位于所有其他server块之前,以保证优先匹配。
五、启用DNS固定策略(服务端模拟)
在首次解析域名后缓存其IP结果,并在同一次请求生命周期内复用该IP,避免因多次解析导致IP变更而绕过校验。
1、使用静态变量或请求上下文存储首次解析结果,键为原始域名。
2、后续对该域名的所有解析操作均优先读取缓存值。
3、在请求结束前不清除该缓存,确保单次请求中域名与IP绑定关系不变。
4、禁止在循环或重复调用场景中重新调用gethostbyname()。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











