Giriş ve Temel İlkeler
Sunucu tarafı istekleri yönetirken SSRF (Server-Side Request Forgery) saldırılarına karşı alınacak önlemler kritik öneme sahiptir. Bu saldırılar, saldırganların kötü niyetli URL'ler aracılığıyla iç ağ kaynaklarına veya hassas servislere erişim sağlamasına olanak tanır. Bu yüzden, hostname ve IP doğrulaması, güvenilirlik ve erişim kontrolü açısından temel güvenlik önlemleridir.
Hostname Doğrulaması ve Güvenlik Kısıtlamaları
İlk adım olarak, kullanıcıdan gelen hostname bilgilerinin, sadece izin verilen alan adları veya domainler ile eşleştiğinden emin olmak gerekir. Bu, genellikle şu şekilde yapılır:
DNS çözümleme: Kullanıcıdan alınan hostname'in DNS sorgusunu gerçekleştirerek IP adresini alırsınız. Bu aşamada, DNS yanıtını dikkatle inceleyerek, yanıtın beklenen alan adından geldiğinden emin olmalısınız.
Sadece belirli alan adları: Güvenlik açısından, erişime izin verilen alan adlarını bir liste halinde tutup, hostname'in bu listede olup olmadığını kontrol edebilirsiniz.
Örneğin:
1234567891011121314
allowed_hosts = ['api.example.com', 'internal.service.local']
def is_allowed_hostname(hostname):
return hostname in allowed_hosts
def resolve_hostname(hostname):
# DNS çözümleme işlemi
ip_addresses = socket.gethostbyname_ex(hostname)[2]
return ip_addresses
if is_allowed_hostname(user_input_hostname):
ip_list = resolve_hostname(user_input_hostname)
# ip doğrulaması devam eder
IP Adresi ve Ağ Doğrulaması
İkinci aşama, DNS çözümlemesi sonrası alınan IP adreslerinin, iç veya dış ağa ait olup olmadığını doğrulamaktır. Bu noktada, IP'lerin belirli IP bloklarıyla karşılaştırılması gereklidir.
İç ağ IP'leri: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 gibi özel IP blokları ile eşleştirilir.
Dış IP'ler: Güvenilir dış IP'ler veya belirli IP aralıklarıyla sınırlandırılır.
Örnek:
[code]
def is_private_ip(ip):
private_ranges = [
('10.0.0.0', '10.255.255.255'),
('172.16.0.0', '172.31.255.255'),
('192.168.0.0', '192.168.255.255')
]
ip_int = int(ipaddress.IPv4Address(ip))
for start, end in private_ranges:
if ip_int >= int(ipaddress.IPv4Address(start)) and ip_int