WordPress中如何获取请求发送方hostname?替代req.hostname方案
可靠获取WordPress REST API请求客户端Hostname的方法
Referer请求头确实存在易篡改、可被禁用的问题,无法满足安全需求,以下是几种更可靠的替代方案:
1. 自定义请求头+可信域名验证
让客户端发送自定义请求头(比如X-Client-Hostname),同时在服务端添加可信域名白名单验证,避免伪造。示例代码:
function handle_proxy_request( $request ) { // 从服务器变量中获取自定义头(注意HTTP_前缀、大写格式) $client_host = $_SERVER['HTTP_X_CLIENT_HOSTNAME'] ?? ''; // 验证客户端hostname是否在可信列表内 $trusted_hosts = ['your-trusted-domain.com', 'another-allowed-domain.org']; if ( !in_array( $client_host, $trusted_hosts ) ) { return new WP_Error( 'invalid_host', '不可信的客户端域名', ['status' => 403] ); } // 后续业务逻辑 // ... }
注意:该方案需要客户端配合发送自定义头,且必须搭配白名单验证,否则仍存在伪造风险。
2. IP反向解析+双向校验
通过客户端IP反向解析hostname,同时校验解析后的IP是否与原客户端IP一致,避免DNS欺骗。示例代码:
function handle_proxy_request( $request ) { $client_ip = $_SERVER['REMOTE_ADDR'] ?? ''; $client_host = gethostbyaddr( $client_ip ); // 反向校验:确保解析出的域名能转回原IP $resolved_ip = gethostbyname( $client_host ); if ( $resolved_ip !== $client_ip ) { $client_host = ''; // 解析不可信,清空结果 } // 后续业务逻辑 // ... }
局限性:并非所有IP都有对应的反向DNS记录,解析结果可能不准确,适合对精度要求不高的场景。
3. 认证凭证绑定域名(最高安全级别)
如果你的API使用API密钥或OAuth认证,可以在后台为每个认证凭证绑定允许的客户端域名。验证时先确认凭证合法性,再取出绑定的域名作为客户端hostname。示例代码:
function handle_proxy_request( $request ) { $api_key = $request->get_header( 'X-API-Key' ); if ( !$api_key ) { return new WP_Error( 'missing_key', '需要提供API密钥', ['status' => 401] ); } // 从WordPress选项中获取密钥对应的绑定域名(需提前配置) $api_keys = get_option( 'custom_api_keys' ) ?? []; $key_data = $api_keys[$api_key] ?? null; if ( !$key_data || empty( $key_data['allowed_host'] ) ) { return new WP_Error( 'invalid_key', '无效的API密钥', ['status' => 403] ); } $client_host = $key_data['allowed_host']; // 后续业务逻辑 // ... }
优势:域名与认证凭证绑定,完全避免伪造,适合高安全要求的场景。
内容的提问来源于stack exchange,提问作者muhammed Amr
相关产品推荐
相关产品推荐

