DNS ana bilgisayar adıyla veya IP Adresiyle eşleşecek düzenli ifade?


369

Herkes herhangi bir yasal DNS ana bilgisayar adı veya IP adresi ile eşleşecek düzenli bir ifade var mı?

Zamanın% 95'inde çalışan bir tane yazmak kolaydır, ancak DNS ana makine adları için en son RFC özelliklerine tam olarak uyması için iyi test edilmiş bir şey almayı umuyorum.

Yanıtlar:


535

Aşağıdaki normal ifadeleri ayrı ayrı veya bir ortak OR ifadesinde birleştirerek kullanabilirsiniz.

ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";

ValidHostnameRegex = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$";

ValidIpAddressRegex geçerli IP adresleri ve ValidHostnameRegex geçerli ana bilgisayar adlarıyla eşleşir . \ Kullandığınız dile bağlı olarak \ ile kaçmanız gerekebilir.


ValidHostnameRegex , RFC 1123 uyarınca geçerlidir . Başlangıçta RFC 952 , ana bilgisayar adı segmentlerinin bir rakamla başlayamayacağını belirtmiştir.

http://en.wikipedia.org/wiki/Hostname

RFC 952'deki ana bilgisayar adlarının özgün belirtimi, etiketlerin bir rakamla veya kısa çizgiyle başlayamayacağını ve kısa çizgiyle bitmemesini zorunlu kılmıştır. Ancak, sonraki bir belirtim ( RFC 1123 ), ana bilgisayar adı etiketlerinin rakamlarla başlamasına izin verdi.

Valid952HostnameRegex = "^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$";

3
Burada: stackoverflow.com/questions/4645126/… - Bir rakamla başlayan adların da geçerli olarak kabul edildiğini açıklarım. Ayrıca, sadece bir nokta şüpheli bir sorundur. Bu konuda daha fazla geri bildirim almak harika olurdu.
BreakPhreak

16
IPv6 eklemek isteyebilirsiniz. OP, ne tür bir adres belirtmedi . (Bu arada, burada bulunabilir )
new123456

32
İnsanlar bunu kodlarında körü körüne kullanmadan önce, bunun tamamen doğru olmadığını unutmayın. RFC2181'i yoksayar: "DNS, kaynak kayıtlarını tanımlamak için kullanılabilen belirli etiketlere yalnızca bir kısıtlama koyar. Bu kısıtlama, etiketin uzunluğu ve tam adıyla ilgilidir. Herhangi bir etiketin uzunluğu, 1 ve 63 sekizli. Tam alan adı 255 sekizli (ayırıcılar dahil) ile sınırlıdır. "
ruble

7
@UserControl: Latin olmayan (Punycoded) ana bilgisayar adları önce ASCII biçimine dönüştürülmeli ( éxämplè.com= xn--xmpl-loa1ab.com) ve sonra doğrulanmalıdır.
Alix Axel

6
Ana bilgisayar adı ifadeniz bazı geçersiz değerlerle eşleşiyor: Denedim 123.456.789.0ve geçerli bir ana bilgisayar adı olduğunu söylüyor.
lbarreira

62

Smink ana bilgisayar adı normal ifadesi bir ana bilgisayar adı içindeki tek tek etiketlerin uzunluğundaki sınırlamaya . Geçerli bir ana bilgisayar adındaki her etiket en fazla 63 sekizli uzunluğunda olabilir.

ValidHostnameRegex = "^ ([a-z-0-9] | [a-z-0-9] [a-z-0-9 \ -] {0,61} [a-z-0-9]) \
(\ ([A-z-0-9] |. [A-z-0-9] [a-z-0-9 \ -] {0,61} [a-z-0-9])) * $"

İlk satırın sonundaki (yukarıda) ters eğik çizginin, uzun satırı bölmek için Unix kabuk sözdizimi olduğunu unutmayın. Normal ifadenin bir parçası değil.

İşte tek bir satırda sadece normal ifade:

^ ([A-z-0-9] | [a-z-0-9] [a-z-0-9 \ -] {0,61} [a-z-0-9]) (\. ([a-z-0-9] | [a-zA-Z0-9] [a-zA-Z0-9 \ -] {0,61} [a-z-0-9])) * $

Ayrıca , ana bilgisayar adının toplam uzunluğunun 255 karakteri geçmediğini ayrıca kontrol etmelisiniz . Daha fazla bilgi için lütfen RFC-952 ve RFC-1123'e başvurun.


6
Mükemmel ana bilgisayar deseni. Muhtemelen bir kişinin dilinin normal ifade uygulamasına bağlıdır, ancak JS için hiçbir şey kaybetmeden biraz daha kısa olacak şekilde ayarlanabilir:/^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?(\.[a-z\d]([a-z\d\-]{0,61}[a-z\d])?)*$/i
Semicolon

31

Geçerli bir IP adresini eşleştirmek için aşağıdaki normal ifadeyi kullanın:

(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}

onun yerine:

([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\.([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])){3}

açıklama

Birçok regex motoru, ORdizideki ilk olasılıkla eşleşir . Örneğin, aşağıdaki normal ifadeyi deneyin:

10.48.0.200

Ölçek

Arasındaki farkı test iyiliği vs bad


5
Başlangıç ​​^ ve bitiş $ 'ı unutmayın, yoksa 0.0.0.999 veya 999.0.0.0 gibi bir şey eşleşecektir. ;)
andreas

1
evet bir dizeyi geçerli kılmak için başlangıç ​​^ ve bitiş $ gereklidir, ancak bir metne IP aradığınızda onu kullanmayın.
Alban

Tanımladığınız istenmeyen 'açgözlülük' diğer ana bilgisayar adı çözümleri için de geçerlidir. Diğerleri tam ana bilgisayar adıyla eşleşmeyeceğinden bunu yanıtınıza eklemeye değer. eg ([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*versus([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]|[a-zA-Z0-9])(\.([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])|[a-zA-Z0-9]))*
ergohack

EDIT: Yukarıda, hatayı görmek +yerine sonunda kullanın *.
ergohack

5

En üstteki yayını düzenleyemiyorum, bu yüzden cevabımı buraya ekleyeceğim.

Ana bilgisayar adı için - kolay yanıt, burada egrep örneğinde - http: //www.linuxinsight.com/how_to_grep_for_ip_addresses_using_the_gnu_egrep_utility.html

egrep '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'

Her ne kadar durum, yumruk sekizlisinde 0 gibi değerleri ve 254 (ip adresi) veya 255'ten (netmask) büyük değerleri hesaba katmıyor. Belki ek bir if ifadesi yardımcı olacaktır.

Yasal dns ana bilgisayar adına gelince, sadece internet ana bilgisayar adlarını (intranet için değil) kontrol etmeniz şartıyla, aşağıdaki snipped'i bir kabuk / php karışımı yazdım, ancak herhangi bir normal ifade olarak uygulanabilir olmalıdır.

önce ietf web sitesine gidin, yasal seviye 1 alan adlarının bir listesini indirin ve ayrıştırın:

tld=$(curl -s http://data.iana.org/TLD/tlds-alpha-by-domain.txt |  sed 1d  | cut -f1 -d'-' | tr '\n' '|' | sed 's/\(.*\)./\1/')
echo "($tld)"

Bu, .com .org veya .ca gibi üst alan adının yasallığını kontrol eden güzel bir yeniden kod parçası vermelidir.

Ardından, ifadenin ilk bölümünü burada bulunan yönergelere göre ekleyin - http: //www.domainit.com/support/faq.mhtml?category=Domain_FAQ&question=9 (herhangi bir alfasayısal kombinasyon ve '-' sembolü, tire işareti olmamalıdır sekizlinin başlangıcı veya sonu.

(([a-z0-9]+|([a-z0-9]+[-]+[a-z0-9]+))[.])+

Sonra hepsini bir araya getirin (PHP preg_match örneği):

$pattern = '/^(([a-z0-9]+|([a-z0-9]+[-]+[a-z0-9]+))[.])+(AC|AD|AE|AERO|AF|AG|AI|AL|AM|AN|AO|AQ|AR|ARPA|AS|ASIA|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BIZ|BJ|BM|BN|BO|BR|BS|BT|BV|BW|BY|BZ|CA|CAT|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|COM|COOP|CR|CU|CV|CX|CY|CZ|DE|DJ|DK|DM|DO|DZ|EC|EDU|EE|EG|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GOV|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|ID|IE|IL|IM|IN|INFO|INT|IO|IQ|IR|IS|IT|JE|JM|JO|JOBS|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MG|MH|MIL|MK|ML|MM|MN|MO|MOBI|MP|MQ|MR|MS|MT|MU|MUSEUM|MV|MW|MX|MY|MZ|NA|NAME|NC|NE|NET|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|ORG|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PRO|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|ST|SU|SV|SY|SZ|TC|TD|TEL|TF|TG|TH|TJ|TK|TL|TM|TN|TO|TP|TR|TRAVEL|TT|TV|TW|TZ|UA|UG|UK|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|XN|XN|XN|XN|XN|XN|XN|XN|XN|XN|XN|YE|YT|YU|ZA|ZM|ZW)[.]?$/i';

    if (preg_match, $pattern, $matching_string){
    ... do stuff
    }

Ayrıca, denetlediğiniz dizenin 256 karakterden kısa olup olmadığını kontrol etmek için bir if ifadesi eklemek isteyebilirsiniz - http://www.ops.ietf.org/lists/namedroppers/namedroppers.2003/msg00964.html


1
-1 çünkü “999.999.999.999” gibi sahte IP adresleriyle eşleşir.
bdesham

1
"Durum, yumruk sekizlisinde 0 gibi değerleri ve 254 (ip adresleri) veya 255'ten (netmask) büyük değerleri hesaba katmasa da."
Alex Volkov

Cevabınızı nitelendirdiğinizi gördüm, evet. İndirdim çünkü cevabınızın bu kısmı hala kullanışlı değil.
bdesham

3

Çoğu zaman, bunu sizin için yapan ve genellikle standart kütüphanede yerleşik olan kütüphaneler olduğunu belirtmek gerekir. Ve bu kütüphaneler, dört yıl önce bir Stack Overflow cevabından kopyaladığınız ve unuttuğunuz koddan çok daha sık güncellenecektir. Ve elbette, adresi size sadece bir grup grupla bir eşleşme vermek yerine, kullanılabilir bir forma ayrıştırırlar.

Örneğin, (POSIX) C'deki IPv4'ü algılama ve ayrıştırma:

#include <arpa/inet.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
  for (int i=1; i!=argc; ++i) {
    struct in_addr addr = {0};
    printf("%s: ", argv[i]);
    if (inet_pton(AF_INET, argv[i], &addr) != 1)
      printf("invalid\n");
    else
      printf("%u\n", addr.s_addr);
  }
  return 0;
}

Açıkçası, örneğin bir sohbet mesajındaki tüm geçerli adresleri bulmaya çalıştığınızda bu işlevler işe yaramaz - ancak orada bile, potansiyel eşleşmeleri bulmak için basit ama aşırı bir regex kullanmak ve daha sonra kullanmak daha kolay olabilir. kütüphane onları ayrıştırmak için.

Örneğin, Python'da:

>>> import ipaddress
>>> import re
>>> msg = "My address is 192.168.0.42; 192.168.0.420 is not an address"
>>> for maybeip in re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', msg):
...     try:
...         print(ipaddress.ip_address(maybeip))
...     except ValueError:
...         pass

2
def isValidHostname(hostname):

    if len(hostname) > 255:
        return False
    if hostname[-1:] == ".":
        hostname = hostname[:-1]   # strip exactly one dot from the right,
                                   #  if present
    allowed = re.compile("(?!-)[A-Z\d-]{1,63}(?<!-)$", re.IGNORECASE)
    return all(allowed.match(x) for x in hostname.split("."))

Bu normal ifadeyi açıklayabilir misiniz? Kesinlikle, (?! -), (? <! -) ne anlama geliyor?
00'da Scit

1
@Scit, regex motorunuz kullanılmasına izin veriyorsa "-" karakteriyle başlamamasını veya bitmemesini sağlar. Örneğin, Python veya Perl'den .
YLearn

1

Bu en iyi Ip doğrulama regex olduğunu düşünüyorum. lütfen bir kez kontrol edin !!!

^(([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))\.){3}([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))$

1
"^((\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])\.){3}(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])$"

1

Bu geçerli IP adresleri için çalışır:

regex = '^([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-5][0-5])[.]([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-5][0-5])[.]([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-5][0-5])[.]([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-5][0-5])$'

1
/^(?:[a-zA-Z0-9]+|[a-zA-Z0-9][-a-zA-Z0-9]+[a-zA-Z0-9])(?:\.[a-zA-Z0-9]+|[a-zA-Z0-9][-a-zA-Z0-9]+[a-zA-Z0-9])?$/

0

İşte ANT_OPTS dışında bir proxy ana bilgisayar IP'si veya ana bilgisayar adı almak için Ant'de kullandığım bir regex. Bu, çatallı JVM için bir proxy yapılandırmadan önce bir Ant "ulaşılabilir" testi çalıştırabilmek için proxy IP'yi elde etmek için kullanıldı.

^.*-Dhttp\.proxyHost=(\w{1,}\.\w{1,}\.\w{1,}\.*\w{0,})\s.*$

Bu \wdoğru, IP'yi yakalamayacak, sadece belirli durumlarda ana bilgisayar adını alacak.
Yaron

0

Bunun IP adresleri için oldukça iyi çalıştığını gördüm. Üst yanıt gibi doğrular, ancak ipin izole edilmesini sağlar, böylece ip veya daha önce hiçbir metin veya daha fazla sayı / ondalık sayı olmaz.

(? <\ S)? ((: \ D | [1-9] \ d | 1 \ d \ d | 2 [0-4] \ d | 25 [0-5]) \ b |. \ b) {7} (?! \ S)


Çok denedim ama burada 2 şeyi anlayamadım. 1. \ b sözcük sınırını belirtir Neden \ b kullanıyoruz? sınır hangisi? ve 2. Neden sadece {7} için çalışıyor? Anladığım kadarıyla, bunun {4} olması gerektiğini düşünüyorum, ama çalışmıyor. İsteğe bağlı olarak, yakalamayan blokları neden kullandığınızı anlayabilirsiniz.
Srichakradhar


0

bunu dene:

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

benim durumumda çalışıyor.


0

IP adresleriyle ilgili olarak, baştaki sıfırların dahil edilip edilmeyeceği konusunda bazı tartışmalar olduğu görülmektedir. Bir zamanlar yaygın bir uygulamadır ve genel olarak kabul edilir, bu yüzden mevcut tercihe bakılmaksızın geçerli olarak işaretlenmeleri gerektiğini savunuyorum . Ayrıca, dizeden önce ve sonra metnin doğrulanması gerekip gerekmediği konusunda bazı belirsizlikler vardır ve yine, bence olması gerekir. 1.2.3.4 geçerli bir IP'dir, ancak 1.2.3.4.5 değildir ve ne 1.2.3.4 kısmı ne de 2.3.4.5 kısmı eşleşmeyle sonuçlanmamalıdır. Endişelerin bazıları bu ifadeyle ele alınabilir:

grep -E '(^|[^[:alnum:]+)(([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.){3}([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])([^[:alnum:]]|$)' 

Buradaki talihsiz kısım, bir okteti doğrulayan regex kısmının, sunulan birçok çözümde olduğu gibi tekrarlandığı gerçeğidir. Bu, desenin örneklerinden daha iyi olmasına rağmen, kullanılan regex'te alt rutinler destekleniyorsa tekrarlama tamamen ortadan kaldırılabilir. Bir sonraki örnek, bu işlevlerin -Pgeçişi ile etkinleştirilmesini sağlar grepve ayrıca ileri ve geri görüş işlevlerinden yararlanır. (Seçtiğim işlev adı octet için 'o'. Ad olarak 'octet' kullanabilirdim ama kısa olmak istedim.)

grep -P '(?<![\d\w\.])(?<o>([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(\.\g<o>){3}(?![\d\w\.])'

IP adresleri cümle biçimindeki bir dosyada ise, nokta nokta gösteriminin bir parçası olmadan takip edebileceğinden, noktanın işlenmesi aslında yanlış negatifler oluşturabilir. Yukarıdakilerin bir varyantı bunu düzeltir:

grep -P '(?<![\d\w\.])(?<x>([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(\.\g<x>){3}(?!([\d\w]|\.\d))'

0
>>> my_hostname = "testhostn.ame"
>>> print bool(re.match("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$", my_hostname))
True
>>> my_hostname = "testhostn....ame"
>>> print bool(re.match("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$", my_hostname))
False
>>> my_hostname = "testhostn.A.ame"
>>> print bool(re.match("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$", my_hostname))
True

0

Yeni Ağ çerçevesi IPv4Address yapısı ve IPv6Address yapısı için, IP adresi bölümünü çok kolay bir şekilde ele alan failable başlatıcılara sahiptir. IPv6'da normal ifadeyle bunu yapmak, tüm kısaltma kurallarıyla zordur.

Ne yazık ki hostname için şık bir cevabım yok.

Ağ çerçevesinin yeni olduğunu unutmayın, bu nedenle sizi en son işletim sistemi sürümleri için derlemeye zorlayabilir.

import Network
let tests = ["192.168.4.4","fkjhwojfw","192.168.4.4.4","2620:3","2620::33"]

for test in tests {
    if let _ = IPv4Address(test) {
        debugPrint("\(test) is valid ipv4 address")
    } else if let _ = IPv6Address(test) {
        debugPrint("\(test) is valid ipv6 address")
    } else {
        debugPrint("\(test) is not a valid IP address")
    }
}

output:
"192.168.4.4 is valid ipv4 address"
"fkjhwojfw is not a valid IP address"
"192.168.4.4.4 is not a valid IP address"
"2620:3 is not a valid IP address"
"2620::33 is valid ipv6 address"

-1

buna ne dersin?

([0-9]{1,3}\.){3}[0-9]{1,3}

9999999999.0.0.9999999999 :) Aynı şekilde, çoğu programcı için bu kısa yaklaşım yeterli olacaktır.
andreas

3
-1 çünkü bu saçma IP adresleriyle eşleşir (@Shebuka notları gibi).
bdesham

-1

php üzerinde: filter_var(gethostbyname($dns), FILTER_VALIDATE_IP) == true ? 'ip' : 'not ip'


2
Bu kod soruyu cevaplayabilse de, genellikle kodun yanında yapılan açıklama bir cevabı çok daha kullanışlı hale getirir. Lütfen cevabınızı düzenleyin ve bir bağlam ve açıklama sağlayın.
user4642212

Ve yanılmıyorsam, FILTER_VALIDATE_IP sadece PHP değeridir.
DonGar

-2

... mywebsite.co.in, thangaraj.name, 18thangaraj.in, thangaraj106.in vb. Gibi ana bilgisayar adlarını kontrol etme,

[a-z\d+].*?\\.\w{2,4}$

3
-1. OP, “en son RFC özelliklerine tam olarak uyması için iyi test edilmiş” bir şey istedi, ancak bu * .museum ile eşleşmezken * .foo ile eşleşecek. Geçerli TLD'lerin listesi .
bdesham

Artıyı karakter sınıfının (köşeli parantez) içine koymanın iyi bir fikir olduğundan emin değilim, ayrıca 5 harfli TLD'ler var ( örneğin .expert ).
Yaron

RFC ile başarmanın en iyi yolu sistem / dil işlevlerini kullanmaktır. inet_atonyeterince iyi.
m3nda

-2

\ D + [.] \ D + [.] \ D + [.] \ D + ile eşleşen IP adresi için bu basit normal ifade eşleme desenini düşündüm


1111.1.1.1 geçerli bir ip değil. Alt ağlarla ilgilenmiyorsanız bir ip formatını gerçekten test etmenin bir yolu yoktur. En azından, ^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}ve tabii ki doğru yol olmayacak bir şeyle görünümlerin sayısına dikkat etmelisiniz . Komut dosyası yazmak için bir diliniz varsa, kesinlikle ağ işlevlerine erişebileceksiniz. GERÇEK bir ip kontrol etmek için en iyi yolu bu sisteme dönüştürmek ve ip doğru formatta söylemek sonra doğru / yanlış kontrol etmek. Python kullanıyorum socket.inet_aton(ip). PHP u gerek durumunda inet_aton($ip).
m3nda

Python kullanıcıları buraya bir göz atabilir
m3nda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.