Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-06.01

URL anatomy ve resource addressing

URL’yi component’lerine ayır; identifier, representation ve erişim kararını ayır. Native parser sonucunda query multiplicity, encoding ve fragment sınırını izle.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Absolute URL

  1. Metin henüz yorumlanmadı

    Katalog adresi yalnız metindir; parser sonucu ve request yok.

    Adres metni
    Input: katalog URL
    Yerel URL parser
    Parser: pending
    Application görünümü
    Görünüm: pending
  2. Authority ayrılır

    Scheme, hostname ve explicit port yerel olarak ayrıldı. DNS çalışmadı.

    Adres metni
    Input: unchanged
    Yerel URL parser
    https: / books.example / 8443
    Application görünümü
    Görünüm: pending
  3. Path/query/fragment ayrılır

    Query iki tag değeri taşır; #summary fragment olarak kalır.

    Adres metni
    Input: unchanged
    Yerel URL parser
    /catalog/atlas; tags: network, web; #summary
    Application görünümü
    Görünüm: pending
  4. Request-target adayı hazırlanır

    Path/query adayı fragment içermez. Bu hesap gerçek HTTP göndermez.

    Adres metni
    Input: unchanged
    Yerel URL parser
    Parser: success
    Application görünümü
    Target: /catalog/atlas?lang=tr&tag=network&tag=web
  5. Fragment client görünümünde kalır

    Summary bölümü bir client seçimi adayıdır; network veya scrolling kanıtı yok.

    Adres metni
    Input: unchanged
    Yerel URL parser
    Parser: success
    Application görünümü
    Fragment: summary; network: not run

Base yok

  1. Relative reference var

    /catalog/atlas tek başına host bilgisini taşımaz.

    Adres metni
    /catalog/atlas
    Yerel URL parser
    Base: absent
    Application görünümü
    Sonuç: pending
  2. Base olmadan constructor çağrılır

    Native URL constructor relative input için base ister.

    Adres metni
    /catalog/atlas
    Yerel URL parser
    Parse: failure / TypeError
    Application görünümü
    Sonuç: pending
  3. Başarı sonucu üretilmez

    Exception network failure değildir; geçerli absolute sonuç yoktur.

    Adres metni
    /catalog/atlas
    Yerel URL parser
    TypeError retained
    Application görünümü
    Destination: absent
  4. Bağlam ayrı düzeltilir

    Bir base seçmek yeni local çözümleme işlemidir; başarısız işlem geçmişi değişmez.

    Adres metni
    /catalog/atlas
    Yerel URL parser
    Base required
    Application görünümü
    HTTP: not sent

ROLLER · STATE · VERİ AKIŞI

Önce resource ile adresini ayır

Duru kitap kataloğunda Atlas kaydını açıyor. Resource, uygulamanın bu kayda verdiği kavramsal kimliktir; URL onu adresleyen identifier’dır. Server aynı kaydı HTML sayfası veya JSON representation olarak sunabilir. URL metnini görünce hangi bytes’ın döneceğini, kaydın varlığını veya Duru’nun erişim hakkını henüz bilmiyoruz.

RFC 3986’da URI, resource identification için genel çerçevedir; URL, erişim mekanizması veya konumla ilişkili identifier türü olarak anlatılır. Güncel browser API’sinin adı URL’dir ve WHATWG standardı browser’ların ortak parsing davranışını tanımlar. RFC generic syntax ile browser parsing’i bütün köşe durumlarında aynı algoritma ilan etme.

Adresin parse edilmesi DNS resolution, TCP/TLS kurulması veya HTTP request gönderilmesi değildir. Bu derste yalnız yerel metin işleme yapılır. books.example bir eğitim adı; sahne oraya bağlanmaz.

Bir URL’yi parçalara ayır

https://books.example:8443/catalog/atlas?lang=tr&tag=network&tag=web#summary örneğini soldan sağa oku: scheme, authority içindeki host/port, path, query ve fragment. Ayırıcıların hangi component’i başlattığı anlamı belirler; her şeyi slash’a göre kesmek yeterli değildir.

Artifact, new URL(input) sonucundan protocol, hostname, host, port, pathname, search ve hash alanlarını gösterir. API’nin protocol değeri https: olur; search ? ile, hash # ile başlar. URL record’daki kavram ile getter’ın kullanıcıya sunduğu metin representation’ını ayır.

Örnekte hostname books.example, host books.example:8443 olur. Path /catalog/atlas’tır. Query üç pair taşır; fragment summary’dir. Bu çıktılar parser observation’dır; henüz request veya server route kararı yok.

Scheme hangi adres ailesini seçer?

Scheme adresin nasıl yorumlanacağını belirleyen ilk component’tir. http ve https web resource erişimi için kullanılır; mailto gibi başka scheme’ler aynı transport veya aynı path yapısını vaat etmez. Her geçerli URL’nin “browser bir HTTP GET yapacak” anlamına geldiğini varsayma.

https metni, HTTPS kullanma niyetini belirtir. Parser başarılı diye certificate validation yapılmış veya güvenli bir bağlantı kurulmuş olmaz. TLS kontrolü ayrı derste gerçek handshake ve validation sınırlarıyla ele alınır.

Application yalnız HTTPS resource link’i kabul edecekse scheme policy’si parser sonucuna uygulanır. Geçerli syntax ile uygulamada uygun kullanım iki ayrı karardır; bu ders policy sonucunu network başarısı olarak sunmaz.

Host ve port, path’in parçası değildir

Host, authority içinde hedefi adlandırır; domain name veya IP address biçimleri olabilir. DNS’in role’ü domain name’i çözümlemekle ilgilidir. Parser’ın hostname alanını üretmesi DNS cevabını veya bir server process’in varlığını kanıtlamaz.

Port, network service endpoint seçimine katılan sayısal component’tir. 8443 sayısı bu fixture’da explicit’tir; evrensel “güvenli alternatif HTTPS portu” kuralı değildir. Service’in gerçekten dinleyip dinlemediği ve protocol’ün çalışıp çalışmadığı ayrıca doğrulanır.

HTTPS default port 443’tür. new URL("https://books.example:443/catalog") serialization’da default port’u kaldırır; port getter’ı boş string döndürür. Bu, hedefin portsuz olduğu anlamına gelmez. Explicit non-default 8443 ise korunur ve origin karşılaştırmasını etkiler.

Host/hostname ayrımı özellikle log ve configuration incelerken işe yarar: host port içerebilir, hostname içermez. Raw metinde karakter aramak yerine aynı parser’ın ürettiği component’lerle karar ver.

Path bir uygulama adresidir

/catalog/atlas, authority’den sonra gelen hierarchical path’tir. Slash’larla ayrılan segments uygulamanın route sözleşmesine girdi olabilir. Bunun server diskinde catalog klasörü ve atlas dosyası olması gerekmez: route handler bir database kaydından response üretebilir.

Path’in anlamını server/framework belirler; URL parser uygulama route tablosunu bilmez. Trailing slash veya case değişikliği uygulamada farklı resource’a, redirect’e ya da aynı route’a karşılık gelebilir. Bu fixture’da /catalog/atlas yalnız kayıt adresidir; dosya sistemi sonucu çıkarılmaz.

Query ile path’i aynı alan sayma. /catalog/atlas?lang=tr örneğinde pathname query’yi içermez. Hangi alanın router’a, locale seçimine veya cache key’e girdi olduğu sonraki işlemde ayrıca tanımlanır.

Query pair’leri kayıpsız oku

Query ? ile başlar; URL standardı bu component’in bütün uygulamalarda aynı business anlamını taşımasını şart koşmaz. Key=value&key=value, URLSearchParams’ın işlediği yaygın form representation’ıdır. Application hangi key’in geçerli, hangi değerin kabul edilebilir olduğunu ayrıca belirler.

Bu örnekte tag iki kez vardır. searchParams.get("tag") ilk değeri network olarak döndürür; getAll("tag") network ve web değerlerini birlikte verir. Tek değer varsayan code ikinci etiketi sessizce kaybedebilir. Parametre multiplicity’si, syntax ve application schema arasındaki bir sözleşmedir.

URLSearchParams’a bütün URL string’ini query sanarak verme; URL object’in searchParams alanını veya ayrılmış search metnini kullan. Query parse edilince lang=tr bir locale adayıdır; object ownership veya authenticated identity kanıtı değildir.

Fragment hangi tarafta kalır?

#summary bir fragment’tir. Normal HTTP resource request’inin target’ına gönderilmez; client, representation içindeki ilgili bölümü seçmek için kullanabilir. Bu URL’den origin-form path/query türetirsek /catalog/atlas?lang=tr&tag=network&tag=web elde ederiz; #summary dışarıda kalır.

Fragment’ın yalnız browser tarafından işlenmesi “gizli veri kasası” olduğu anlamına gelmez. Page code onu okuyabilir ve ayrıca bir request’e koyabilir. Buradaki dar claim, ilk URL’nin fragment component’inin normal resource request’ine dahil olmamasıdır.

Sahne path/query adayını hazırlayıp fragment’ı client tarafında ayrı gösterir. Gerçek HTTP gönderimi veya DOM scrolling çalıştırılmaz; request-target türetme ile fragment tüketimi ayrı local işlemlerdir.

Encoding, metni taşıma biçimidir

Percent-encoding bir byte’ı % ve iki hexadecimal digit ile temsil eder. Unicode metnin önce hangi encoding ile byte’a dönüştüğü önemlidir. q=notlar ı örneğinde URLSearchParams, UTF-8 representation’ını ve form serialization’ını kullanır; artifact sonucu q=notlar+%C4%B1 olur.

Form query serialization’da space + olur; literal + değeri ise %2B olarak korunur. Genel URL component’lerinde “+ her zaman space” kuralı yoktur. Aynı resource’a ait URL.search ile URLSearchParams serialization’ı metinsel olarak farklı görünebilir; hangi katmanın temsilini okuduğunu belirt.

Encoding encryption veya authorization değildir. Değer açıldığında yine aynı application input’tur. Zaten encoded metni raw değer sanıp tekrar encode etmek representation’ı değiştirir; parsing ve validation sırasını tek bir açık sözleşmede tut.

Artifact native API ile round-trip yapılan küçük normal metin örnekleri içerir. Server’ın özel decode pipeline’ı veya bir parser bypass modeli bu fixture’da yoktur.

Absolute adres ve relative reference

Absolute URL scheme ve gerekli component’leriyle kendi parsing bağlamını sağlar. /catalog/atlas gibi relative reference ise base olmadan hangi host’a ait olduğunu söylemez. new URL("/catalog/atlas") TypeError üretir; aynı reference geçerli bir HTTPS base ile çözülebilir.

Relative resolution string concatenation değildir. Base path’in son slash’ı, reference’ın root-relative veya current-directory-relative oluşu ve query/fragment türü sonucu etkiler. WEB-06.03 bu hesapları ayrı ayrı izler.

Parser başarılıysa oluşan absolute URL’nin component’lerini yeniden okuyabilirsin. Henüz destination’ın erişilebilirliğini veya application policy’sinde uygun olduğunu bilmiyoruz; çözümleme, adlandırma ve izin farklı sorulardır.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Query değerleri

  1. Normal katalog reference’ı seçildi

    Duru, books.example port 8443 üzerindeki Atlas katalog link’ini seçer. Query’de lang=tr ve iki tag değeri vardır; #summary ayrı fragment’tır. Consumer, hangi component’i hangi amaçla kullandığını açık tutmalıdır.

    URL reference evidence
    Atlas URL / query + fragment
    Structured parsing
    Parsed fields yok
    Consumer boundary
    Application policy yok
  2. Parser alanları birbirinden ayrıldı

    Parser hostname’i books.example, host’u books.example:8443 ve pathname’i /catalog/atlas olarak ayırır. Origin https://books.example:8443 olur. Metnin benzemesi, structured hostname veya origin karşılaştırmasının yerini tutmaz.

    URL reference evidence
    Atlas URL / query + fragment
    Structured parsing
    hostname / host / origin separate
    Consumer boundary
    Application policy yok
  3. Karar için representation kaybı durdu

    tags=[network, web] iki değerdir. İlk value’yu seçmek ikinci value’yu yok sayan farklı application schema kararıdır; parser’ın onları tek value’ya çevirdiği iddia edilmez.

    URL reference evidence
    Atlas URL / query + fragment
    Structured parsing
    hostname / host / origin separate
    Consumer boundary
    Both tags retained: network,web
  4. Encoding authority değildir

    A+B değeri form encoding’de q=A%2BB olur; notlar ı değeri q=notlar+%C4%B1 olur. Bu dönüşüm encryption veya permission oluşturmaz, yalnız representation değiştirir.

    URL reference evidence
    Raw values / form serialization separate
    Structured parsing
    hostname / host / origin separate
    Consumer boundary
    Both tags retained: network,web
  5. Parser success policy success değildir

    Structured URL üretildikten sonra uygun scheme/destination/port ve query schema application tarafından ayrıca değerlendirilir. Resource authorization’ın sonucu URL anatomy’den çıkarılmaz.

    URL reference evidence
    Raw values / form serialization separate
    Structured parsing
    Parsed URL / policy still separate
    Consumer boundary
    Both tags retained: network,web
  6. Boundary sonucu desteklenen alanda

    Query multiplicity ve ilk/all values farkı korunmuştur. NetworkRequestsExecuted=0 olduğundan server yorumlaması veya data exposure sonucu eklenmez.

    URL reference evidence
    Raw values / form serialization separate
    Structured parsing
    Parsed URL / policy still separate
    Consumer boundary
    Multiplicity preserved / server unknown

Fragment sınırı

  1. Normal katalog reference’ı seçildi

    Duru, books.example port 8443 üzerindeki Atlas katalog link’ini seçer. Query’de lang=tr ve iki tag değeri vardır; #summary ayrı fragment’tır. Consumer, hangi component’i hangi amaçla kullandığını açık tutmalıdır.

    URL reference evidence
    Atlas URL / query + fragment
    Structured parsing
    Parsed fields yok
    Consumer boundary
    Application policy yok
  2. Parser alanları birbirinden ayrıldı

    Parser hostname’i books.example, host’u books.example:8443 ve pathname’i /catalog/atlas olarak ayırır. Origin https://books.example:8443 olur. Metnin benzemesi, structured hostname veya origin karşılaştırmasının yerini tutmaz.

    URL reference evidence
    Atlas URL / query + fragment
    Structured parsing
    hostname / host / origin separate
    Consumer boundary
    Application policy yok
  3. Karar için representation kaybı durdu

    HTTP origin-form yalnız /catalog/atlas?lang=tr&tag=network&tag=web içerir. #summary bu request target’a katılmaz; client component’i olarak kalır. Server router’ın fragment’ı aldığı iddia edilmez.

    URL reference evidence
    Atlas URL / query + fragment
    Structured parsing
    hostname / host / origin separate
    Consumer boundary
    Request target excludes #summary
  4. Encoding authority değildir

    A+B değeri form encoding’de q=A%2BB olur; notlar ı değeri q=notlar+%C4%B1 olur. Bu dönüşüm encryption veya permission oluşturmaz, yalnız representation değiştirir.

    URL reference evidence
    Raw values / form serialization separate
    Structured parsing
    hostname / host / origin separate
    Consumer boundary
    Request target excludes #summary
  5. Parser success policy success değildir

    Structured URL üretildikten sonra uygun scheme/destination/port ve query schema application tarafından ayrıca değerlendirilir. Resource authorization’ın sonucu URL anatomy’den çıkarılmaz.

    URL reference evidence
    Raw values / form serialization separate
    Structured parsing
    Parsed URL / policy still separate
    Consumer boundary
    Request target excludes #summary
  6. Boundary sonucu desteklenen alanda

    Fragment client’ta, request-target path/query kapsamındadır. Bu separation UI scroll veya gerçek HTTP delivery ölçümü değildir.

    URL reference evidence
    Raw values / form serialization separate
    Structured parsing
    Parsed URL / policy still separate
    Consumer boundary
    Fragment separated / delivery unknown

VARSAYIM · SINIR · KONTROL

Trust hangi işlemde kuruluyor?

Bir security incelemesinde önce input’u tüketen katmanı bul: browser parser mı, server router mı, application validation mı? Aynı URL farklı amaçlar için işlenebilir. “Text looks like our domain” ifadesi parser sonucunun veya policy kararının yerine geçmez.

Duru’nun normal katalog link’ini artifact üzerinden izle. Scheme/hostname/port adayları yerel olarak elde edilir; resource authorization henüz uygulanmaz. Sorulacak soru, sonraki katmanın hangi structured alanı hangi amaç için trusted saydığıdır.

Artifact’ta tags array’ini, ilk get sonucunu ve request-target adayını yan yana koy. network ve web iki ayrı query value’dur; summary fragment’ı bu listede bulunmaz. Review notunda ikinci tag’ın neden kaybolmadığını ve fragment’ın hangi aşamada client’ta kaldığını açıkça anlat.

Representation kaybı karar kaybına dönüşebilir

İki tag değerinden yalnız birini tutmak veya fragment’ı request-target sanmak, işlem hakkında yanlış sonuç üretir. Önce ham reference’ı, parser sonucunu ve application schema sonucunu ayrı gözlemler olarak kaydet; birbirinin yerine yazma.

Bu link’te iki tag query pair’i ile #summary fragment’ı farklı consumer’lara aittir. URL parser bunları ayrı alanlarda verir; application schema hangi query değerlerinin kullanılacağını belirler. Fragment’ın request-target dışında kalması, client code’un onu ayrıca başka bir mesajda göndermesini engelleyen bir gizlilik kontrolü değildir.

Encoding branch’inde raw A+B ile serialized q=A%2BB değerlerini karşılaştır. Farklı metinler aynı normal değerin iki representation’ıdır; bu farkı yeni permission veya encrypted secret diye raporlama. Round-trip başarısı yalnız seçilmiş API dönüşümünü doğrular, server’ın bütün input pipeline’ını değil.

3. Blue · Güvenli geliştirme ve savunma

Hareket olmadan bütün senaryoları oku

Encoding check

  1. Raw query değerleri seçildi

    Form serialization için iki normal value seçilir: A+B ve notlar ı. Bunlar query string değil, URLSearchParams’a verilecek ham değerlerdir. Hangi API representation’ının üretildiği bilinmeden plus veya percent text’i yorumlanmaz.

    URL input evidence
    Raw: A+B / notlar ı
    Normalization review
    Serialization henüz yok
    Observation scope
    Server observation yok
  2. Form serialization kendi kurallarını uygular

    URLSearchParams literal + karakterini %2B, space karakterini + ve UTF-8 ı byte’larını %C4%B1 yapar. Bu örnekte q=A%2BB ve q=notlar+%C4%B1 oluşur. Raw input ile serialized query farklı metin biçimleridir.

    URL input evidence
    Raw: A+B / notlar ı
    Normalization review
    q=A%2BB / q=notlar+%C4%B1
    Observation scope
    Server observation yok
  3. Encoding source value’suyla eşleşti

    q=A%2BB literal plus’ı korur, q=notlar+%C4%B1 space ve UTF-8 ı representation’ını verir. Round-trip aynı value’yu geri kurar; bütün server pipeline doğrulanmış olmaz.

    URL input evidence
    A+B ↔ q=A%2BB
    Normalization review
    q=A%2BB / q=notlar+%C4%B1
    Observation scope
    Claim scope yok
  4. Query multiplicity regression’da var

    lang ve iki tag value ayrı okunur; tags expected [network, web]’dir. Fragment summary query key/value değildir ve HTTP origin-form’a katılmaz.

    URL input evidence
    A+B ↔ q=A%2BB
    Normalization review
    Two tags / fragment excluded
    Observation scope
    Claim scope yok
  5. Observation minimum veriyle tutuldu

    Bu katalog URL’si public locale/tag bilgisi taşır. Gerçek URL’ler history/log/telemetry’ye yayılabileceği için scheme/host/path ve gereken schema alanları amaçla sınırlı seçilir; URL default kalıcı identity kaydı yapılmaz.

    URL input evidence
    A+B ↔ q=A%2BB
    Normalization review
    Two tags / fragment excluded
    Observation scope
    Public fields / purpose-limited log
  6. Parser evidence network yerine geçmedi

    Seçilmiş form round-trip ve query multiplicity uygundur. Encoding secrecy, input trust veya server acceptance sonucu üretmez.

    URL input evidence
    A+B ↔ q=A%2BB
    Normalization review
    Two tags / fragment excluded
    Observation scope
    Round-trip consistent / trust separate

Default port

  1. Açık default port içeren URL seçildi

    Input https://books.example:443/catalog’tur. Raw reference :443 içerir; href, hostname, port ve origin getter’ları henüz okunmadı. Burada parser çalışması yerel işlemdir; service’e bağlantı yoktur.

    URL input evidence
    Raw https://books.example:443/catalog
    Normalization review
    Getter sonuçları bekliyor
    Observation scope
    Network ölçülmedi
  2. Default port serialization’dan çıkar

    HTTPS default port 443 olduğu için native URL API port getter’ını boş string verir ve href=https://books.example/catalog üretir. Bu normalize representation’da service portu yok olmuş değildir; scheme’in default port’u geçerlidir.

    URL input evidence
    Raw :443 bilgisi karşılaştırmada tutuldu
    Normalization review
    port=""; href=https://books.example/catalog
    Observation scope
    Network ölçülmedi
  3. Origin aynı default endpoint’i adlandırır

    Bu HTTP(S) örneğinde origin https://books.example olur. Path /catalog origin’in parçası değildir. Explicit :443 ile implicit HTTPS default port farklı raw text’ler olsa da aynı normalized origin’i üretir.

    URL input evidence
    Raw :443 / normalized HTTPS URL
    Normalization review
    Origin https://books.example; default 443
    Observation scope
    Origin eşitliği access izni değildir
  4. Non-default port ayrı karşılaştırmadır

    Ana katalog input’unda port 8443’tür; bu non-default değer serialization’da korunur ve origin https://books.example:8443 olur. 443 ile 8443 karşılaştırması port normalization’ı açıklar, TLS veya listener başarısını ölçmez.

    URL input evidence
    Karşılaştırma: default 443 / non-default 8443
    Normalization review
    443 boş getter / 8443 korunur
    Observation scope
    TLS/listener sonucu yok
  5. Gözlemin üreticisi URL API’dir

    Href ve getter çıktıları yerel URL API’nin parsing sonucudur. Application scheme/port policy’si, DNS, TLS ve HTTP sonucu farklı işlemlerden gelir. Parser çıktısını bunların yerine yazmak, hesaplanmış adresi gözlenmiş connection gibi raporlar.

    URL input evidence
    Input ve normalized çıktı birlikte tutulur
    Normalization review
    Üretici local URL API
    Observation scope
    Coverage parsing ile sınırlı
  6. Boş getter, portsuz service değildir

    Default-port ve non-default karşılaştırmalarında hangi representation’ın kullanıldığı açık kalır. Relative input’a base vermeden yapılan ayrı parse işlemi TypeError üretir; başarılı default-port sonucu bu failure’a taşınmaz. Network veya permission sonucu yine bilinmez.

    URL input evidence
    Default/non-default/base gereksinimi ayrı
    Normalization review
    Default port normalize; TypeError ayrı
    Observation scope
    Parser scope biliniyor; access bilinmiyor

UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA

Aynı parser, açık application policy

URL’yi standard parser ile çözümle; izin verilen scheme, destination veya port gibi uygulama gereksinimlerini structured sonuç üstünde değerlendir. Parser’ın başarılı olması allow kararı değildir. Query key/value schema’sı da ayrı doğrulanır.

Configuration’da raw URL, normalized URL ve policy sonucu arasındaki farkı anlaşılır tut. Observation defterinde accepted-by-parser ile accepted-by-application ayrı alanlar olmalıdır; network success ancak gerçekten ölçüldüyse eklenir.

Log ve link üretiminde veri sınırını koru

Query’ye secret veya kişisel veriyi gereksizce koyma; URL farklı log, history ve telemetry yüzeylerinde görünebilir. Bu fixture yalnız public katalog ve etiket bilgisi taşır. Log için gerekli alanları seç; bütün URL’yi varsayılan olarak kalıcı identity kaydı yapma.

Link üretirken değerleri string birleştirerek tahmin etmek yerine URL/URLSearchParams ile oluştur. Sonuçta beklenen pathname, query multiplicity ve fragment ayrımını benign unit fixture’larla doğrula; encoding’i güvenlik kontrolü diye etiketleme.

Lab observation’ında port getter’ının boş olduğu default-port case’i ayrı tut. Bir ekip arkadaşı bunu port eksikliği sanarsa normalized href ve scheme’i birlikte göster. Log veya configuration karşılaştırması için hangi representation’ın kullanıldığını sabitlemek, aynı hedefin iki farklı metin biçimini doğru yorumlamaya yardım eder.

ŞİMDİ VAKAYA UYGULA

Query values, fragment ve normalized port hangi consumer kararlarına aittir?

Duru, Atlas katalog link’inde iki tag kullanır. Fragment summary client’ta kalırken server target’ı path ve query taşır. URL parsing veya encoding işlemi, bu adrese erişim izni vermez.

Vakadaki browser ve API’yi URL bileşenleriyle tanımla. Target, origin ve site aynı soru değildir; her birini hangi kararın kullandığını belirt.

Bağlı vaka dosyasını aç ↗

ÖRNEĞİ BİRLİKTE OKUYALIM

URL component ve serialization defteri

Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.

Ham kaydı ve alan açıklamalarını oku
{
  "input": "https://books.example:8443/catalog/atlas?lang=tr&tag=network&tag=web#summary",
  "expected": {
    "protocol": "https:",
    "hostname": "books.example",
    "host": "books.example:8443",
    "port": "8443",
    "pathname": "/catalog/atlas",
    "search": "?lang=tr&tag=network&tag=web",
    "hash": "#summary",
    "origin": "https://books.example:8443",
    "tags": [
      "network",
      "web"
    ],
    "httpOriginForm": "/catalog/atlas?lang=tr&tag=network&tag=web"
  },
  "defaultPort": {
    "input": "https://books.example:443/catalog",
    "expectedPort": "",
    "expectedHref": "https://books.example/catalog"
  },
  "formEncoding": [
    {
      "value": "notlar ı",
      "expected": "q=notlar+%C4%B1"
    },
    {
      "value": "A+B",
      "expected": "q=A%2BB"
    }
  ],
  "relativeWithoutBase": {
    "input": "/catalog/atlas",
    "expectedError": "TypeError"
  },
  "networkRequestsExecuted": 0
}
input
Yerel olarak parse edilen normal katalog adresi.
expected.host / expected.hostname
Host port’u içerir; hostname içermez.
expected.tags
Repeated query values getAll ile korunur.
expected.httpOriginForm
Path/query adayı; fragment hariç, gerçek request yok.
formEncoding
Form serialization ve raw değere geri dönüş.

Sentetik eğitim girdileri gerçek Node URL API ile kontrol edilir. DNS, HTTP, TLS, DOM navigation veya server-side decode çalıştırılmaz.

İki yanlış kanı

Parse edilen HTTPS URL’ye güvenli bağlantı kurulmuştur.

Parsing yerel işlemdir; DNS, TLS validation ve HTTP sonucu ayrıca ölçülür.

Encoding gizlilik sağlar; fragment server’a giden query’nin parçasıdır.

Encoding representation’dır. Normal request target path/query taşır; fragment client tarafında ayrı kalır.

SIRA SENDE

Bu hikâyeyi sen çöz.

Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.

tag=network&tag=web query’sini tek değer gibi okursan hangi bilgiyi kaybedersin?

  1. İki ayrı tag değeri ve sırası kaybolur.
  2. İkinci tag syntax hatası olduğu için atılmalıdır.
Gerekçeli cevabı oku

İki ayrı tag değeri ve sırası kaybolur. — Örnek tags=[network, web] verir. Query key’inin tekrarı geçerli bir veri yapısıdır.

HTTP origin-form request target neden #summary içermez?

Dersten seçilen artifact alanları; öğretim örneği

expected.host
books.example:8443
expected.hostname
books.example
expected.hash
#summary
expected.httpOriginForm
/catalog/atlas?lang=tr&tag=network&tag=web
  1. Fragment browser tarafındadır; HTTP target path ve query taşır.
  2. Fragment pathname’e eklenerek server route’u olarak gönderilir.
Gerekçeli cevabı oku

Fragment browser tarafındadır; HTTP target path ve query taşır. — hash bir URL bileşenidir, fakat bu origin-form target içinde server’a gönderilmez.

A+B ve notlar ı değerlerinin form encoding farkını açıkla. Percent-encoding neden encryption değildir?

Gerekçeli cevabı oku

URLSearchParams form serialization boşluğu +, literal plus karakterini %2B yapar. ı karakterinin UTF-8 byte’ları %C4%B1 olarak temsil edilir. Bu geri çözülebilen representation syntax’ıdır; secret key veya confidentiality sağlamaz. Aynı raw URL string’inin farklı parser ve context’lerde aynı anlamda yorumlanacağını varsayamayız.

□ Plus karakteri ile boşluğun serialization farkını açıkladım.

□ Encoding’den confidentiality garantisi çıkarmadım.

Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç

MANUAL LAB

URL Boundary Lab

Component, origin/site ve relative resolution sonuçlarını önce tahmin et, sonra native API ile karşılaştır.

Tahmin → gözlem → açıklama workbook’unu aç ↗GitHub kaynakları ↗

Kaynaklar ve kapsam