2016-12-07 124 views
1

例如,我有這樣的數組IPS,並希望與我的代碼來創建一個長的SPF記錄:如何創建多個IP SPF記錄(SPF超過255個字符)

$array_ips = array(); 
$array_ips[] = "32.16.8.133"; 
$array_ips[] = "32.16.4.247"; 
$array_ips[] = "35.16.8.184"; 
$array_ips[] = "32.16.8.127"; 
$array_ips[] = "32.16.8.134"; 
$array_ips[] = "32.16.2.154"; 
$array_ips[] = "32.16.2.153"; 
$array_ips[] = "32.16.2.150"; 
$array_ips[] = "39.16.2.190"; 
$array_ips[] = "32.16.2.128"; 
$array_ips[] = "32.16.0.128"; 
$array_ips[] = "32.16.8.187"; 
$array_ips[] = "43.16.8.185"; 
$array_ips[] = "32.16.8.192"; 
$array_ips[] = "32.16.4.249"; 
$array_ips[] = "52.16.4.252"; 
$array_ips[] = "32.16.4.238"; 
$array_ips[] = "32.16.4.232"; 

$ips = implode(' ip4:', $array_ips); 

echo "v=spf1 +a +mx".$ips." -all"; 

SPF記錄會是:

v=spf1 +a +mx ip4:32.16.8.133 ip4:32.16.4.247 ip4:32.16.8.184 ip4:32.16.8.127 ip4:32.16.8.134 ip4:32.16.2.154 ip4:32.16.2.153 ip4:32.16.2.150 ip4:32.16.2.190 ip4:32.16.2.128 ip4:32.16.0.128 ip4:32.16.8.187 ip4:32.16.8.185 ip4:32.16.8.192 ip4:32.16.4.249 ip4:32.16.4.252 ip4:32.16.4.238 ip4:32.16.4.232 -all 

性狀:307

存在的問題是,一個SPF只能是最大值。 255個字符長。沒有可能在txt dns記錄中在plesk或cpanel中添加如此長的字符串。我已經聽說,如果可以做到這一點"v=spf1 .... first" "spf second string..."

但它真的有用嗎? 如何在上面的示例中生成它?

+0

你可以添加多個記錄 –

+0

@Dagon你怎麼說這個? – Mann87

+0

@Dagon多個記錄??? – Kitson88

回答

0

你需要通過子網來完成。使用標準的IP4子網符號:

「V = SPF1 IP4:192.168.0.1/16,所有」

允許192.168.0.1和192.168.255.255之間的任何IP地址。

+0

但我們沒有全部ips。我們隨機獲取它們。那麼添加所有變體不是最佳解決方案還是? – Mann87

+0

是的 - 我不確定你的例子是如何隨機的IP,但你沒有其他的解決方案,但允許一些IP,你不能控制。在你的問題中你可以使用'32.16.0.1/16'來覆蓋它們,或者你可以添加'32.16.2.1/24 32.16.4.1/24 32.16.8.1/24'來縮小它的範圍。但是你需要一些涵蓋所有你需要的算法。 – Robbie

+0

否則,您可以爲該域添加多個A記錄嗎?我假設不是,但是我認爲我會提及,因爲你有+ a,這意味着它會檢查那些。 – Robbie

-2

我已經找到了解決辦法:

echo "v=spf1 +a +mx ("'.implode('" "',$array_ips).' ") -all"; 

但我發現它的頁面是不是在enlish。 (空間是requierd和()

http://www.nullpointer.at/keyword/spf/

翻譯:

TXT記錄太長。在這裏,在這個例子中,TXT記錄被分成幾行。語法是:括號(然後用引號「第一部分」引用下一行「第二部分」等等,最後括號)。重要提示:不要忘記用引號括起來的每個部分中的空白:「第一部分」「第二部分」然後組成「第一部分第二部分」。

+0

@ Mann87在這裏做了更新 – JOUM

+0

您的解決方案將無法正常工作回聲將輸出v = spf1 + a + mx(「32.16.8.133」「32.16.4.247」「32.16.8.184」「32.16.8.127」「32.16.8.134」「 32.16.2.154「」32.16.2.153「」32.16.2.150「」32.16.2.190「」32.16.2.128「」32.16.0.128「」32.16.8.187「」32.16.8.185「」32.16.8.192「」32.16.4.249「」 32.16.4.252「」32.16.4.238「」32.16.4.232「)-all – Mann87

+0

你必須在ip不是'」32.16.8.133「'後做空格而不是''32.16.8.133」'< - 注意空格 – JOUM

1

如果你願意允許一個/ 24子網連接幾個IP,你可以做如下的事情。如果你喜歡,你甚至可以正確地將其子網劃分。無論如何,它都會大幅減少你的名單。

<?php 

$array_ips = array(); 
$array_ips[] = "32.16.8.133"; 
$array_ips[] = "32.16.4.247"; 
$array_ips[] = "35.16.8.184"; 
$array_ips[] = "32.16.8.127"; 
$array_ips[] = "32.16.8.134"; 
$array_ips[] = "32.16.2.154"; 
$array_ips[] = "32.16.2.153"; 
$array_ips[] = "32.16.2.150"; 
$array_ips[] = "39.16.2.190"; 
$array_ips[] = "32.16.2.128"; 
$array_ips[] = "32.16.0.128"; 
$array_ips[] = "32.16.8.187"; 
$array_ips[] = "43.16.8.185"; 
$array_ips[] = "32.16.8.192"; 
$array_ips[] = "32.16.4.249"; 
$array_ips[] = "52.16.4.252"; 
$array_ips[] = "32.16.4.238"; 
$array_ips[] = "32.16.4.232"; 


$subnetArr = []; 

foreach ($array_ips as $k=>$v) { 

    $i = strrpos($v, '.'); 
    $testSub = substr($v, 0, -(strlen($v) - $i)); 

    if (in_array("ip4:" . $testSub . ".1/24", $subnetArr)) { 

     //Do something here or change condition 

    } else { 

     array_push($subnetArr,"ip4:" . $testSub . ".1/24"); 

    } 
} 


$ips = implode(' ', $subnetArr); 
echo "v=spf1 +a +mx ".$ips." -all"; 

輸出

v=spf1 +a +mx ip4:32.16.8.1/24 ip4:32.16.4.1/24 ip4:35.16.8.1/24 ip4:32.16.2.1/24 ip4:39.16.2.1/24 ip4:32.16.0.1/24 ip4:43.16.8.1/24 ip4:52.16.4.1/24 -all 

編輯:

只是改變因此它實際上呼應的SPF!

+0

感謝這個解決方案的工作。如果這是我不知道的最佳解決方案。因爲也有可能使用某個IP範圍內的IP來使用我的域名進行發送。 – Mann87

1

你可以把它分成多個包含的..

"v=spf1 mx a include:iprange1.example.com include:iprange2.example.com -all" 
下各

然後包括DNS你必須

iprange1.example.com = "v=spf1 ip4:32.16.8.133 ... -all" 
iprange2.example.com = "v=spf1 ip4:32.16.4.238 ... -all" 

這將會給你更多的房間,因爲你將能夠包括8包括沿與您的MX和

然後,每個包含可以容納16個IP4地址,將得到你的約128個IP地址,你不能CIDR。

編輯 - iprange1 - > iprange2 2日的代碼片段的2線

+1

但是,如果1個IP = 1個域名是什麼?比你的解決方案無法工作。 – Mann87

+0

我不明白你在問什麼,請提供一個例子。 – Henry