Merhabalar ben saldırı timlerinden Bunjo, bu konuda "HTTP" kavramını ve nasıl çalıştığını detaylıca açıklamaya çalışacağım.
HTTP (Hyper Text Transfer Protocol)
HTTP (Hypertext Transfer Protocol), internet üzerinde bilgi alışverişi için kullanılan bir iletişim protokolüdür. Bu protokol, istemci-sunucu modeline dayanır ve genellikle web tarayıcıları ile web sunucuları arasında kullanılır. HTTP, HTML, CSS, JavaScript gibi web sayfalarının yanı sıra resimler, videolar ve diğer medya dosyalarının transferinde de kullanılır.
HTTP'nin temel amacı, bir istemcinin bir web sunucusundan belirli bir kaynağı (örneğin, bir web sayfasını veya bir resmi) talep etmesi ve sunucunun bu talebe uygun bir yanıt vermesidir. Bu süreç, HTTP metotları, durum kodları, başlıklar ve diğer özelliklerle tanımlanmıştır.
Güvenlik:
- HTTP, verileri şifrelemeden transfer eder, bu nedenle iletilen veriler açık bir şekilde okunabilir. Bu durum, kullanıcıların kişisel bilgilerini veya hassas verilerini korumak için güvenli değildir.
- HTTPS ise, SSL/TLS (Secure Socket Layer/Transport Layer Security) protokollerini kullanarak verileri şifreler. Bu, iletilen bilgilerin güvenli olmasını sağlar ve üçüncü tarafların verileri anlamasını zorlaştırır. Kullanıcıların bilgilerini korumak için daha güvenli bir seçenektir.
- HTTP'de güvenlik sertifikası gerekmez. Veri şifrelenmez ve bu nedenle güvenlik sertifikasına ihtiyaç duyulmaz.
- HTTPS'de ise, bir web sitesinin güvenilir olduğunu ve verilerin şifrelendiğini doğrulayan bir SSL/TLS sertifikası gereklidir. Bu sertifika, bir web sitesinin URL'sinin başındaki "https://" ile belirtilir.
- HTTP, genellikle 80 numaralı portu kullanır.
- HTTPS, genellikle 443 numaralı portu kullanır.
- Google ve diğer arama motorları, HTTPS kullanan siteleri teşvik etmektedir. HTTPS kullanan siteler, arama motoru sıralamalarında avantaj elde edebilir. Bu nedenle, güvenlik ve SEO açısından HTTPS tercih edilebilir.
- HTTPS, veri bütünlüğünü sağlamak için hash fonksiyonları kullanır. Bu, verilerin transfer sırasında değiştirilmediğini garanti eder.
- HTTP'de ise, veri bütünlüğü sağlanmaz, bu nedenle veriler transfer sırasında değiştirilebilir.
HTTP'nin Güvensiz Yanları:
HTTP bağlantıları şifrelenmemiştir ve bu nedenle veriler açık bir şekilde iletilir. Bu durum, ağ üzerindeki herhangi bir kişinin veya sistem tarafından verilerin kolayca okunabileceği anlamına gelir. Bu, kullanıcıların özel bilgilerini veya hassas verilerini korumak için yeterince güvenli değildir.
SSL (Secure Sockets Layer) veya daha modern versiyonu olan TLS (Transport Layer Security), iletişim kanalını şifreleyerek güvenliği artıran bir güvenlik protokolüdür. Bu protokoller, HTTP üzerinden iletilen verilerin şifrelenerek, verilerin sadece alıcı ve gönderen arasında anlaşılabilir olmasını sağlar.
Eğer bir web sitesi "http" protokolü kullanıyorsa, bu durumda veriler şifrelenmeden iletiliyor demektir ve bu, üçüncü tarafların bu verilere müdahale etme olasılığını artırır. Bu nedenle, özellikle kullanıcıların kişisel bilgilerini girdikleri veya hassas verilerini paylaştıkları durumlarda, web siteleri "https" protokolü kullanarak şifreleme sağlamalıdır. Bu, güvenli bir bağlantı kurularak verilerin gizliliği ve bütünlüğü sağlanır.
HTTP'nin çalışma prensiplerini şu şekilde sıralayabiliriz;
İstemci-Sunucu İlişkisi: HTTP, bir istemci-sunucu modeline dayanır. İstemci, genellikle bir web tarayıcısıdır ve kullanıcının isteğini sunucuya ileten taraftır.
Sunucu, istemcinin isteğine yanıt veren ve istemciye istenen bilgileri gönderen taraftır.
Tarayıcı Kontrolü: Tarayıcı, kullanıcının adres çubuğuna girdiği URL'yi önbelleğinde aratır, eğer bu veriye karşılık IP adresi varsa (anahtar-değer çiftleri) direkt yönlendirmesini yapar,
Eğer herhangi bir kayıt yok ise İstemci, tarayıcısındaki adres çubuğuna bir URL (Uniform Resource Locator) girer ve DNS (Domain Name System) kullanılıyorsa
URL'yi IP (Internet Protocol Address) haline getirmek için DNS sunucusuna başvrurur. ( IP adresi girerseniz tarayacı tekrardan gidip DNS sunucusuna başvurmaz. )
DNS Çözümleme: İstemci (Burada tarayıcı), girilen URL'in IP adresini belirlemek için DNS (Domain Name System) sunucusuna başvurduktan sonra çözümleme işleminin başlatılmasını DNS sunucusuna söyler.
DNS çözümleme süreci şu adımları takip eder:
DNS Sunucusu İstek ve Yanıt: Tarayıcı, DNS sunucusuna URL'nin IP adresini çözümlemesi için bir istek gönderir. DNS sunucusu, URL'nin karşılık geldiği IP adresini içeren bir yanıt gönderir.
DNS Sunucusundan Cevap Alma: DNS sunucusu, istenilen alan adının karşılık geldiği IP adresini bulup tarayıcıya cevap verir.
IP Adresi ile Bağlantı: Tarayıcı, aldığı IP adresi üzerinden web sitesine bağlantı kurar ve istenilen içeriği talep eder.
DNS çözümlemesi bittikten sonra;
TCP Bağlantısı Kurma: İstemci, belirlenen IP adresine TCP (Transmission Control Protocol) bağlantısı kurar. Bu bağlantı, istemci ve sunucu arasında güvenilir bir veri iletim kanalı sağlar.
TCP Bağlantısı Kurma: İstemci, belirlenen IP adresine TCP (Transmission Control Protocol) bağlantısı kurar. Bu bağlantı, istemci ve sunucu arasında güvenilir bir veri iletim kanalı sağlar.
HTTP İstek Metodu: İstemci, belirli bir kaynağa erişmek için bir HTTP isteği gönderir. Bu istek, bir HTTP metodu (GET, POST, PUT, DELETE, vb.) ve hedef URL'i içerir.
HTTP İstek Metodları:
GET: Belirtilen kaynağı almak için kullanılır. Genellikle web tarayıcıları tarafından kullanılan bir metottur. URL'de gömülü parametreleri kullanarak veri almak için kullanılır.
POST: Belirtilen kaynağa yeni bir veri eklemek için kullanılır. Genellikle form verilerini sunucuya göndermek için kullanılır. Veri gövdesinde iletilen bilgiler, URL'de değil, HTTP isteğinin gövdesinde bulunur.
PUT: Belirtilen kaynağı oluşturmak veya güncellemek için kullanılır. Özellikle RESTful servislerde kullanılır. Bir kaynak yoksa oluşturur, varsa günceller.
DELETE: Belirtilen kaynağı silmek için kullanılır. RESTful servislerde kaynağı silmek için kullanılır.
PATCH: Belirtilen kaynağın bir kısmını güncellemek için kullanılır. Kaynağı tamamen güncellemeden sadece belirli alanları değiştirmek amacıyla kullanılır.
HEAD: Belirtilen kaynağın sadece başlık bilgilerini almak için kullanılır. GET metoduna benzer, ancak sadece başlık bilgilerini alır, içeriği almaz.
OPTIONS: Belirtilen kaynağın desteklediği HTTP metotlarını sorgulamak için kullanılır. Sunucuya hangi metotları kullanabileceğinizi sormak için kullanılır.
TRACE: İstemci ve sunucu arasındaki iletişimi izlemek için kullanılır. Genellikle hata ayıklama veya güvenlik amaçlarıyla kullanılır.
CONNECT: Sunucu ile güvenli bir bağlantı (SSL/TLS) kurmak için kullanılır. Genellikle HTTPS trafiği için kullanılır.
En çok "GET" ve "POST" HTTP istek metodları kullanılır.
GET: Belirtilen kaynağı almak için kullanılır. Genellikle web tarayıcıları tarafından kullanılan bir metottur. URL'de gömülü parametreleri kullanarak veri almak için kullanılır.
POST: Belirtilen kaynağa yeni bir veri eklemek için kullanılır. Genellikle form verilerini sunucuya göndermek için kullanılır. Veri gövdesinde iletilen bilgiler, URL'de değil, HTTP isteğinin gövdesinde bulunur.
PUT: Belirtilen kaynağı oluşturmak veya güncellemek için kullanılır. Özellikle RESTful servislerde kullanılır. Bir kaynak yoksa oluşturur, varsa günceller.
DELETE: Belirtilen kaynağı silmek için kullanılır. RESTful servislerde kaynağı silmek için kullanılır.
PATCH: Belirtilen kaynağın bir kısmını güncellemek için kullanılır. Kaynağı tamamen güncellemeden sadece belirli alanları değiştirmek amacıyla kullanılır.
HEAD: Belirtilen kaynağın sadece başlık bilgilerini almak için kullanılır. GET metoduna benzer, ancak sadece başlık bilgilerini alır, içeriği almaz.
OPTIONS: Belirtilen kaynağın desteklediği HTTP metotlarını sorgulamak için kullanılır. Sunucuya hangi metotları kullanabileceğinizi sormak için kullanılır.
TRACE: İstemci ve sunucu arasındaki iletişimi izlemek için kullanılır. Genellikle hata ayıklama veya güvenlik amaçlarıyla kullanılır.
CONNECT: Sunucu ile güvenli bir bağlantı (SSL/TLS) kurmak için kullanılır. Genellikle HTTPS trafiği için kullanılır.
En çok "GET" ve "POST" HTTP istek metodları kullanılır.
Header (Başlık): İstek başlıkları, isteğin ek bilgilerini içerir. Örneğin, tarayıcı türü, kabul edilebilir dil, içerik türü gibi bilgileri içerir.
HTTP başlıkları (headers), bir HTTP isteği veya yanıtının ek bilgilerini taşıyan bileşenlerdir.
Başlıklar, isteğin veya yanıtın içeriğini daha iyi anlamamıza ve yönetmemize yardımcı olur.
Bunları otomatize yapan bir araç istiyorsanız onu da anlattım.
Konu linki:
"GET Request" ile "Header" ve "Response" Bilgisi Çekmek
Bazı Header Başlıkları:
Genel Başlıklar:
Cache-Control: Önbellek kontrolü için kullanılır. Önbellek yönetimini belirlemek için kullanılır.
Connection: Bağlantı kontrolünü belirlemek için kullanılır. "Keep-Alive" gibi değerler alabilir.
Date: Yanıtın oluşturulduğu tarihi belirtir.
Pragma: HTTP/1.0 uyumlu önbellek kontrolü için kullanılır.
Trailer: İleti gövdesindeki trailer alanları hakkında bilgi verir.
Transfer-Encoding: İletinin transfer kodlamasını belirtir. Örneğin, "chunked" değeri.
Upgrade: Protokol yükseltmelerini belirtir. Örneğin, HTTP/2'ye geçiş için kullanılabilir.
Connection: Bağlantı kontrolünü belirlemek için kullanılır. "Keep-Alive" gibi değerler alabilir.
Date: Yanıtın oluşturulduğu tarihi belirtir.
Pragma: HTTP/1.0 uyumlu önbellek kontrolü için kullanılır.
Trailer: İleti gövdesindeki trailer alanları hakkında bilgi verir.
Transfer-Encoding: İletinin transfer kodlamasını belirtir. Örneğin, "chunked" değeri.
Upgrade: Protokol yükseltmelerini belirtir. Örneğin, HTTP/2'ye geçiş için kullanılabilir.
İstek Başlıkları:
Host: İstek yapılan sunucunun adını belirtir. Virtual hosting durumlarında kullanılır.
User-Agent: İstemcinin kullanılan yazılımını belirtir. Sunucu, bu bilgiyi kullanıcı deneyimini optimize etmek için kullanabilir.
Accept: İstemcinin destekleyebileceği medya türlerini belirtir. Sunucu, bu bilgiyi kullanarak uygun bir içerik türü seçebilir.
Referer (sic): İstemcinin hangi sayfadan geldiğini belirtir. Sayfa izleme ve istatistik toplama amaçları için kullanılır.
Cookie: İstemcinin sunucuya daha önce gönderdiği tanımlama bilgilerini içerir. Oturum yönetimi için kullanılır.
Authorization: İstemcinin kimlik doğrulama bilgilerini içerir. Özellikle şifreli bağlantılarda (HTTPS) kullanılır.
Host: İstek yapılan sunucunun adını belirtir. Virtual hosting durumlarında kullanılır.
User-Agent: İstemcinin kullanılan yazılımını belirtir. Sunucu, bu bilgiyi kullanıcı deneyimini optimize etmek için kullanabilir.
Accept: İstemcinin destekleyebileceği medya türlerini belirtir. Sunucu, bu bilgiyi kullanarak uygun bir içerik türü seçebilir.
Referer (sic): İstemcinin hangi sayfadan geldiğini belirtir. Sayfa izleme ve istatistik toplama amaçları için kullanılır.
Cookie: İstemcinin sunucuya daha önce gönderdiği tanımlama bilgilerini içerir. Oturum yönetimi için kullanılır.
Authorization: İstemcinin kimlik doğrulama bilgilerini içerir. Özellikle şifreli bağlantılarda (HTTPS) kullanılır.
Yanıt Başlıkları:
Location: Tarayıcıya yönlendirme yapmak için kullanılır. Özellikle 3xx durum kodlarıyla birlikte kullanılır.
Server: Sunucunun kullandığı yazılım veya servis adını belirtir.
Content-Type: Yanıtın içeriğinin tipini (text/html, application/json, image/jpeg, vb.) belirtir.
Content-Length: Yanıtın içeriğinin uzunluğunu (byte cinsinden) belirtir.
Set-Cookie: Tarayıcıya gönderilen yeni tanımlama bilgilerini belirtir.
ETag: Kaynağın güncel olup olmadığını kontrol etmek için kullanılır.
Server: Sunucunun kullandığı yazılım veya servis adını belirtir.
Content-Type: Yanıtın içeriğinin tipini (text/html, application/json, image/jpeg, vb.) belirtir.
Content-Length: Yanıtın içeriğinin uzunluğunu (byte cinsinden) belirtir.
Set-Cookie: Tarayıcıya gönderilen yeni tanımlama bilgilerini belirtir.
ETag: Kaynağın güncel olup olmadığını kontrol etmek için kullanılır.
Durum Kodları: Sunucu, bir işlemin başarılı olup olmadığını belirten bir durum kodu gönderir (200 OK, 404 Not Found, 500 Internal Server Error, vb.).
1xx - Bilgi Mesajları (Informational)
- 100 Continue: İstemcinin isteği devam edebilir; sunucu bekliyor.
- 101 Switching Protocols: Sunucu, isteği başka bir protokole geçirme talebini kabul ediyor.
2xx - Başarılı İstek (Successful)
- 200 OK: İstek başarıyla gerçekleştirildi.
- 201 Created: İstek tarafından kaynak başarıyla oluşturuldu.
- 204 No Content: İstek başarıyla gerçekleştirildi, ancak yanıtta içerik yok.
3xx - Yönlendirme (Redirection)
- 301 Moved Permanently: Kaynak, kalıcı olarak başka bir konuma taşındı.
- 302 Found (or Moved Temporarily): Kaynak, geçici olarak başka bir konuma taşındı.
- 303 See Other: GET metodunu kullanarak başka bir konuma yönlendirme yapılması gerekiyor.
- 304 Not Modified: Kaynak, istemcinin önbelleğinde bulunuyor ve değişmemiş.
4xx - İstemci Hatası (Client Error)
- 400 Bad Request: İstek, sunucu tarafından anlaşılamadı veya uygun değil.
- 401 Unauthorized: İstemci, kimlik doğrulaması gerektiren bir kaynağa erişmeye çalıştı, ancak kimlik doğrulaması başarısız.
- 403 Forbidden: İstemci, kaynağa erişmeye yetkili değil.
- 404 Not Found: İstenen kaynak bulunamadı.
5xx - Sunucu Hatası (Server Error)
- 500 Internal Server Error: Sunucu, genel bir içsel hata ile karşılaştı.
- 501 Not Implemented: Sunucu, isteği yerine getirecek yeteneğe sahip değil.
- 502 Bad Gateway: Sunucu, geçerli bir yanıt almak için geçerli bir geçit sunucusuna ihtiyaç duyuyor.
- 503 Service Unavailable: Sunucu şu anda kullanılamıyor (genellikle bakım nedeniyle).
Bu durum kodları, HTTP protokolüyle ilgili istemcilerin ve sunucuların iletişimlerini daha iyi kontrol etmelerini sağlar.
Header ve İçerik (Body):Yanıt başlıkları, istemciye ek bilgiler sağlar. Yanıt içeriği, isteğe bağlı olarak bir kaynağın içeriğini içerir (HTML sayfası, resim, JSON verisi, vb.).
TCP Bağlantısının Kapatılması veya Tekrar Kullanılması: Bağlantının kapatılması veya tekrar kullanılması, HTTP sürümü ve "Connection" başlığına bağlı olarak belirlenir. Keep-Alive özelliği, aynı bağlantının bir dizi istek ve yanıt arasında açık kalmasına olanak tanır.
Tarayıcı İşleme ve Gösterim: İstemci, aldığı yanıtı işleyerek, kullanıcıya görüntülenebilir bir içerik sunar.
CORS (Cross-Origin Resource Sharing): Güvenlik önlemleri olarak, tarayıcılar farklı alan adlarından gelen kaynaklara erişim konusunda kısıtlamalar getirebilir. CORS, bu tür kısıtlamaların aşılmasına yardımcı olan bir mekanizmadır.
CORS Nedir?
CORS (Cross-Origin Resource Sharing), farklı kökenlere (origin) sahip web sayfalarının birbirleriyle kaynakları paylaşmasını sağlayan bir güvenlik önlemidir. Bu, tarayıcı güvenliği nedeniyle, bir web sayfası sadece aynı kök (origin) üzerindeki kaynaklara doğrudan erişebileceği bir politika olduğunu düşünürken, CORS, farklı kökten kaynaklara erişimi kontrol eder.
Web sayfaları arasında kökten köke (cross-origin) erişim sağlama ihtiyacı ortaya çıkabilir, özellikle bir web sayfasının içeriği başka bir kaynaktan (örneğin, başka bir sunucu veya domain) alındığında. CORS, bu tür durumlarda güvenli bir erişim sağlamak için kullanılır.
Örnekleyelim.
Basit İstek (Same-Origin)
Web Sayfası Alanı (Origin): https://web.sayfa.com
API Sunucusu Alanı: (API): https://api.servis.com
Web Sayfası İsteği:
Web sayfasındaki JavaScript kodu, aynı alan içindeki bir API'ye basit bir GET isteği yapmak istiyor.
CORS (Cross-Origin Resource Sharing), farklı kökenlere (origin) sahip web sayfalarının birbirleriyle kaynakları paylaşmasını sağlayan bir güvenlik önlemidir. Bu, tarayıcı güvenliği nedeniyle, bir web sayfası sadece aynı kök (origin) üzerindeki kaynaklara doğrudan erişebileceği bir politika olduğunu düşünürken, CORS, farklı kökten kaynaklara erişimi kontrol eder.
Web sayfaları arasında kökten köke (cross-origin) erişim sağlama ihtiyacı ortaya çıkabilir, özellikle bir web sayfasının içeriği başka bir kaynaktan (örneğin, başka bir sunucu veya domain) alındığında. CORS, bu tür durumlarda güvenli bir erişim sağlamak için kullanılır.
Örnekleyelim.
Basit İstek (Same-Origin)
Web Sayfası Alanı (Origin): https://web.sayfa.com
API Sunucusu Alanı: (API): https://api.servis.com
Web Sayfası İsteği:
Web sayfasındaki JavaScript kodu, aynı alan içindeki bir API'ye basit bir GET isteği yapmak istiyor.
JavaScript:
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.servis.com/data', true);
xhr.send();
İstek Sonucu:
Domain ile API servisi aynı alan adına sahip olduğu için CORS kontrolü olmadan istek gönderilir.
Cross-Origin İstek (CORS)
Web Sayfası İsteği:
Web sayfasındaki JavaScript kodu, farklı bir etki alanındaki API'ye GET isteği yapmak istiyor.
Domain ile API servisi aynı alan adına sahip olduğu için CORS kontrolü olmadan istek gönderilir.
Cross-Origin İstek (CORS)
Web Sayfası İsteği:
Web sayfasındaki JavaScript kodu, farklı bir etki alanındaki API'ye GET isteği yapmak istiyor.
JavaScript:
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://başka.api.servis.com/data', true);
xhr.send();
Sonuç:Tarayıcı bu isteği önce kontrol eder. Eğer API sunucusu, isteğin geldiği alanı kabul ediyorsa (CORS başlıklarıyla belirlenir),
istek başarılı bir şekilde gerçekleştirilir. Aksi takdirde, tarayıcı isteği engeller.
CORS Başlıkları
API sunucusu, hangi etki alanlarından gelen isteklere izin verileceğini belirleyen CORS başlıklarını kullanır.
Örneğin, aşağıdaki gibi başlıklar API sunucusu tarafından gönderilebilir:
Anlatacaklarım bu kadar.
Okuduğunuz için teşekkürler.
@P4$A Hocama özel teşekkürlerimi sunarım...
Örneğin, aşağıdaki gibi başlıklar API sunucusu tarafından gönderilebilir:
Anlatacaklarım bu kadar.
Okuduğunuz için teşekkürler.
@P4$A Hocama özel teşekkürlerimi sunarım...
Son düzenleme: