如何用PHP自动获取任意域名的DKIM选择器以查询DKIM记录?
解决DKIM Selector自动获取的问题
首先得明确:没有100%通用的方法能自动获取任意域名的DKIM Selector,因为Selector是域名所有者自行定义的,没有强制的公共注册目录。但可以通过以下几种常见方式尝试探测:
1. 从DMARC记录中提取线索
部分域名会在DMARC记录的rua或ruf报告地址里附带Selector信息,比如格式可能是rua=mailto:dmarc-report@example.com?subject=dmarc&dkim=selector1。你可以解析DMARC记录的文本内容,提取这类参数。
示例PHP代码:
$domaine = "example.com"; // 先获取DMARC记录并做安全处理 $safeDomain = escapeshellarg($domaine); $dmarcRaw = shell_exec('nslookup -type=txt _dmarc.'.$safeDomain); $dmarcRecords = []; // 提取有效的DMARC TXT记录 preg_match_all('/"([^"]+)/', $dmarcRaw, $matches); foreach ($matches[1] as $match) { if (str_starts_with($match, "v=DMARC1")) { $dmarcRecords[] = $match; } } // 尝试从DMARC记录中提取selector $foundSelectors = []; foreach ($dmarcRecords as $record) { if (preg_match('/dkim=([a-zA-Z0-9_-]+)/', $record, $selMatch)) { $foundSelectors[] = $selMatch[1]; } }
2. 尝试通用常见Selector命名
很多域名会使用一些通用的Selector名称,你可以遍历这些常见值,逐个查询是否存在对应的DKIM记录。
常见的通用Selector列表:default, mail, selector1, selector2, dkim, smtp, postmaster, mx, s1, s2
示例PHP代码:
$commonSelectors = ["default", "mail", "selector1", "selector2", "dkim", "smtp", "postmaster"]; $domaine = "example.com"; $dkimRecords = []; foreach ($commonSelectors as $selector) { // 必须做安全处理,防止命令注入 $safeSelector = escapeshellarg($selector); $safeDomain = escapeshellarg($domaine); $dkimRaw = shell_exec("dig $safeSelector._domainkey.$safeDomain txt +short"); if (!empty(trim($dkimRaw))) { $dkimRecords[$selector] = trim($dkimRaw); } } // 输出找到的DKIM记录 print_r($dkimRecords);
3. 解析目标域名的邮件头(需邮件样本)
如果能获取到该域名发送的邮件,可以解析邮件头中的DKIM-Signature字段,其中s=后面的值就是Selector。比如:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=selector1; ...
但这种方法依赖邮件样本,不适合无样本的批量自动扫描场景。
重要注意事项
- 所有传入shell命令的参数(比如域名、selector)必须用
escapeshellarg()处理,防止命令注入漏洞,这是你当前代码里缺失的关键安全步骤。 - 以上方法都无法保证覆盖所有域名,因为有些域名会使用非常独特的Selector名称,或者根本没有配置DKIM记录。
内容的提问来源于stack exchange,提问作者Israel Bara
相关产品推荐
相关产品推荐

