WEB / WEB-16.S01
Validation, normalization ve interpretation boundaries
Atlas book preview’de byte, JSON value, NFC domain record ve sink representation’ı ayrı izle.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
NFC preview
- JSON girdisi hazır
Örneğin title ve quantity içeren JSON girdisi hazırdır. Henüz parse edilmiş value veya kabul edilmiş preview record yoktur.
- Raw bytes
- Byte budget bekleniyor
- JSON value
- JSON value yok
- Domain gate
- Doğrulanmış record yok
- Preview consumer
- Preview yok
- Byte budget kararı
JSON girdisi önce 128 byte budget ve UTF-8 kurallarıyla kabul edilir. Bu adım field type veya business kuralını doğrulamaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- JSON value yok
- Domain gate
- Doğrulanmış record yok
- Preview consumer
- Preview yok
- JSON value hazır
JSON object parse edilmiştir; value’ların türleri artık görülebilir. Schema kararı henüz verilmediği için preview oluşmaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- Doğrulanmış record yok
- Preview consumer
- Preview yok
- Schema kararı
title:string ve quantity:integer, closed schema’nın beklediği iki alandır. quantity=2 schema’yı geçer; domain kararı henüz tamamlanmaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- Schema geçerli
- Preview consumer
- Preview yok
- Domain ve NFC sınırı
Schema’yı geçen title NFC ile Café olur. quantity=2, izin verilen 1–3 aralığındadır; kabul edilen record artık hazırlanabilir.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- NFC Café; quantity=2 geçerli
- Preview consumer
- Preview yok
- Preview sonucu
Kabul edilen Café/2 record’u plain preview verisi üretir. Bu sonuç yalnız public preview içindir; başka bir business mutation yapılmaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- NFC Café; quantity=2 geçerli
- Preview consumer
- Preview Café / 2
Wrong type
- JSON girdisi hazır
Örneğin title ve quantity içeren JSON girdisi hazırdır. Henüz parse edilmiş value veya kabul edilmiş preview record yoktur.
- Raw bytes
- Byte budget bekleniyor
- JSON value
- JSON value yok
- Domain gate
- Doğrulanmış record yok
- Preview consumer
- Preview yok
- Byte budget kararı
JSON girdisi önce 128 byte budget ve UTF-8 kurallarıyla kabul edilir. Bu adım field type veya business kuralını doğrulamaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- JSON value yok
- Domain gate
- Doğrulanmış record yok
- Preview consumer
- Preview yok
- JSON value hazır
JSON object parse edilmiştir; value’ların türleri artık görülebilir. Schema kararı henüz verilmediği için preview oluşmaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- Doğrulanmış record yok
- Preview consumer
- Preview yok
- Schema kararı
quantity="two" parse edilebilen bir string’tir; ancak schema integer ister. Field-type rejection verilir ve domain record oluşturulmaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- field-type
- Preview consumer
- Preview yok
- Domain ve NFC sınırı
Schema reddi nedeniyle domain ve NFC aşaması çalışmaz. Parse edilmiş object, kabul edilmiş preview record yerine kullanılamaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- Domain değerlendirilmedi
- Preview consumer
- Preview yok
- Preview sonucu
Görünüm field-type reddini gösterir. previewRecord null kalır; geçersiz tür boş bir başarı veya quantity değeri gibi sunulmaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- Domain değerlendirilmedi
- Preview consumer
- No preview; field-type
Quantity limit
- JSON girdisi hazır
Örneğin title ve quantity içeren JSON girdisi hazırdır. Henüz parse edilmiş value veya kabul edilmiş preview record yoktur.
- Raw bytes
- Byte budget bekleniyor
- JSON value
- JSON value yok
- Domain gate
- Doğrulanmış record yok
- Preview consumer
- Preview yok
- Byte budget kararı
JSON girdisi önce 128 byte budget ve UTF-8 kurallarıyla kabul edilir. Bu adım field type veya business kuralını doğrulamaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- JSON value yok
- Domain gate
- Doğrulanmış record yok
- Preview consumer
- Preview yok
- JSON value hazır
JSON object parse edilmiştir; value’ların türleri artık görülebilir. Schema kararı henüz verilmediği için preview oluşmaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- Doğrulanmış record yok
- Preview consumer
- Preview yok
- Schema kararı
quantity=5 integer olduğu için schema’yı geçer. Alanların türü doğru olsa da preview’nin miktar kuralı henüz değerlendirilmemiştir.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- Schema geçerli
- Preview consumer
- Preview yok
- Domain ve NFC sınırı
quantity=5 izin verilen 1–3 aralığının dışındadır. Domain kararı girdiyi reddeder; schema başarısı preview üretmeye yetmez.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- Domain range rejected
- Preview consumer
- Preview yok
- Preview sonucu
Görünüm domain-range reddini gösterir. previewRecord null kalır; type check’i geçen miktar kabul edilmiş preview gibi sunulmaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- Domain range rejected
- Preview consumer
- No preview; domain-range
Extra field
- JSON girdisi hazır
Örneğin title ve quantity içeren JSON girdisi hazırdır. Henüz parse edilmiş value veya kabul edilmiş preview record yoktur.
- Raw bytes
- Byte budget bekleniyor
- JSON value
- JSON value yok
- Domain gate
- Doğrulanmış record yok
- Preview consumer
- Preview yok
- Byte budget kararı
JSON girdisi önce 128 byte budget ve UTF-8 kurallarıyla kabul edilir. Bu adım field type veya business kuralını doğrulamaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- JSON value yok
- Domain gate
- Doğrulanmış record yok
- Preview consumer
- Preview yok
- JSON value hazır
JSON object parse edilmiştir; value’ların türleri artık görülebilir. Schema kararı henüz verilmediği için preview oluşmaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- Doğrulanmış record yok
- Preview consumer
- Preview yok
- Schema kararı
reviewed:true, closed schema’nın izin verdiği iki alanın dışındadır. Extra field reddedilir; sessizce atılıp record kabul edilmez.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- closed-shape
- Preview consumer
- Preview yok
- Domain ve NFC sınırı
Closed-shape reddi nedeniyle domain ve NFC aşaması çalışmaz. Uygulama reddedilmiş object’ten kabul edilmiş record çıkarmaz.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- Domain değerlendirilmedi
- Preview consumer
- Preview yok
- Preview sonucu
Görünüm closed-shape reddini gösterir. previewRecord null kalır; ek alanın atılmasıyla oluşan bir başarı gösterilmez.
- Raw bytes
- Byte budget kabul edildi; UTF-8
- JSON value
- Object parse edildi; türler biliniyor
- Domain gate
- Domain değerlendirilmedi
- Preview consumer
- No preview; closed-shape
ROLLER · STATE · VERİ AKIŞI
Parse sonucu uygulama kararı değildir
Atlas public book preview için title ve quantity alır. Normal örnekte title, Cafe ve combining acute karakterinden oluşur; quantity=2 seçilmiştir. JSON parser metni value’lara dönüştürür. Bu işlem quantity’nin izinli aralıkta olduğunu veya caller’ın business action yapabileceğini söylemez. Aynı pipeline’da byte kabulü, parse, schema ve domain kararı ayrı sonuçlar üretir.
Örneğin giriş profili en çok 128 byte kabul eder, UTF-8’i strict decode eder ve bir JSON object ister. Python json varsayılanları tek başına bu profile karşılık gelmez: duplicate member için ayrı bir rejection hook’u, nonstandard numeric constant için açık bir rejection vardır. Küçük object’ler için seçilen bu kurallar, parser depth veya bütün resource exhaustion durumlarını kapsamaz.
Schema ve domain farklı sorular sorar
Closed schema yalnız title:string ve quantity:integer alanlarını kabul eder. Eksik alan, null, extra field ve yanlış tür ayrı biçim hatalarıdır. quantity=5 bir integer olduğu için type check’i geçer; ancak Atlas preview kuralı yalnız 1–3 aralığını kabul eder. Numeric string “2” için sessiz coercion yapılmaz; API’nin kabul ettiği representation açık kalır.
Wrong-type dalındaki quantity="two", parse edilebilen bir string’tir; sorun JSON syntax değildir. Extra-field dalında reviewed:true alanı reddedilir ve preview record oluşmaz. Girdinin geçerli olması user permission vermediği için örnek yalnız public preview verisi üretir. Bir sipariş, ödeme, private note veya session üzerinde mutation yapmaz.
Normalization için hangi eşitliği seçtin?
Title için NFC seçilmiştir. Cafe + U+0301 ile Café’nin byte ve code point dizileri farklı olabilir; canonical normalization bu iki örneği aynı title’a dönüştürür. Normalization, comparison ve storage için kullanılacak representation’ı belirler. Buradaki uzunluk kuralı, NFC sonrasında 1–40 Unicode code point kabul eder. Byte, grapheme cluster ve ekrandaki glyph sayısı aynı ölçü değildir.
NFKC, compatibility distinction’larını da birleştirebilir; bütün free text’e sessizce uygulanmamalıdır. Fullwidth A örneğinde NFC ve NFKC farklı sonuçlar üretir. Normalized title’ı sonraki aşamada yeniden decode edip başka anlam vermek, önceki kontrolün baktığı representation’ı değiştirir. Bu profil aynı normalized record’u tüketir; normalization bir sanitizer veya authorization kararı değildir.
Encoding ve parameterization sink’e aittir
Preview, title’ı plain text olarak tüketir. HTML text serialization gerektiğinde o context’e uygun encoding ayrıca seçilir. Tea & Bread için ampersand, HTML text’te entity olarak temsil edilir; domain title ise Tea & Bread olarak kalır. Bu iki representation’ı birbirine karıştırma. HTML text encoding, JavaScript source, URL destination veya SQL query structure için genel bir güvenlik dönüşümü değildir.
Parameterization, query/program structure ile value’yu ayrı API kanallarında tutar. Validation ise value’nun bu operation için uygun olup olmadığını kontrol eder. Sonraki database dersi, sabit query ve bound title üzerinden bu sınırı işler. Burada SQL veya command çalıştırılmaz. Escape edilmiş bir title ile query text oluşturmak, named parameter kullanmakla aynı mekanizma değildir.
Gate başarısızsa yarım record kullanma
Artifact, parsed, schemaValid, domainValid, normalizedTitle ve previewRecord alanlarını ayırır. Yanlış tür için parsed=true olabilirken previewRecord null kalır. Domain limit dalında schemaValid=true ama domainValid=false olur. Extra field sessizce atılıp kabul edilmiş record’a taşınmaz. Bu sonuçlar reddin hangi aşamada verildiğini gösterir; tek bir generic invalid etiketi bu ayrımı kaybettirir.
Raw input eksikse sonuç not-computed olur; bu durum boş title veya malformed JSON ile aynı değildir. Sahnedeki actor’lar aynı local pipeline’ın sorumluluklarını temsil eder; bir value’yu parse etmek için packet gönderilmez. Raw representation’dan kabul edilmiş record’a giderken hangi bilgi değiştiğini ve hangi value’nun henüz tüketilmediğini izleyebilirsin.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Extra field
- Public preview contract seçildi
Profile yalnız title ve quantity keys’ini kabul eder; quantity range 1..3’tür. Client form control’leri bu local authoritative kuralın yerine geçmez.
- Public JSON input
- case=extra-field
- Schema/domain gate
- Consumer gate okunmadı
- Preview boundary
- Preview record yok
- JSON parse sonucu ayrı okundu
Parsed=true olduğu için bu input JSON grammar’a uyar. Parse success, schema veya domain acceptance’a tek başına yeterli değildir.
- Public JSON input
- case=extra-field
- Schema/domain gate
- Parsed=true
- Preview boundary
- Preview record yok
- İlk consumer failure gate’i okundu
Input reviewed=true extra field taşır; closed-shape policy schemaValid=false verir. Bu alanın JSON boolean olması profile’a ek authority kazandırmaz.
- Public JSON input
- case=extra-field
- Schema/domain gate
- Closed shape rejected
- Preview boundary
- Preview record yok
- Normalization failure nedeni yapılmadı
Extra-field row normalizedTitle=null tutar; downstream normalized record oluşmuş varsayılmaz.
- Public JSON input
- case=extra-field
- Schema/domain gate
- No accepted normalized record
- Preview boundary
- Preview record yok
- Preview construction durduruldu
decision=REJECT ve previewRecord=null korunur. Reason closed-shape olarak kalır; private resource permission sonucu eklenmez.
- Public JSON input
- case=extra-field
- Schema/domain gate
- Reason: closed-shape
- Preview boundary
- No preview construction
- Interpretation katmanları birbirine karışmadı
Bu negatif input parse edilebilir, fakat consumer contract’ı geçmez. JSON, schema, business rule ve output context farklı boundaries’dir; punctuation blacklist bu ayrımı kurmaz.
- Public JSON input
- case=extra-field
- Schema/domain gate
- Known: consumer denial
- Preview boundary
- No accepted preview record
Domain limit
- Public preview contract seçildi
Profile yalnız title ve quantity keys’ini kabul eder; quantity range 1..3’tür. Client form control’leri bu local authoritative kuralın yerine geçmez.
- Public JSON input
- case=domain-limit
- Schema/domain gate
- Consumer gate okunmadı
- Preview boundary
- Preview record yok
- JSON parse sonucu ayrı okundu
Parsed=true olduğu için bu input JSON grammar’a uyar. Parse success, schema veya domain acceptance’a tek başına yeterli değildir.
- Public JSON input
- case=domain-limit
- Schema/domain gate
- Parsed=true
- Preview boundary
- Preview record yok
- İlk consumer failure gate’i okundu
Quantity=5 exact integer type’ına uyar; schemaValid=true kalır. Operation range 1..3 olduğundan domainValid=false’tur.
- Public JSON input
- case=domain-limit
- Schema/domain gate
- Schema true; domain false
- Preview boundary
- Preview record yok
- Normalization failure nedeni yapılmadı
normalizedTitle=Café verilmiştir. Doğru NFC output, quantity domain failure’ını düzeltmez.
- Public JSON input
- case=domain-limit
- Schema/domain gate
- NFC title valid; quantity denied
- Preview boundary
- Preview record yok
- Preview construction durduruldu
decision=REJECT ve previewRecord=null korunur. Reason domain-range olarak kalır; private resource permission sonucu eklenmez.
- Public JSON input
- case=domain-limit
- Schema/domain gate
- Reason: domain-range
- Preview boundary
- No preview construction
- Interpretation katmanları birbirine karışmadı
Bu negatif input parse edilebilir, fakat consumer contract’ı geçmez. JSON, schema, business rule ve output context farklı boundaries’dir; punctuation blacklist bu ayrımı kurmaz.
- Public JSON input
- case=domain-limit
- Schema/domain gate
- Known: consumer denial
- Preview boundary
- No accepted preview record
VARSAYIM · SINIR · KONTROL
Valid JSON’dan hangi sonucu çıkarabilirsin?
quantity="two" örneğini parse failure diye raporlamak yanlış aşamayı işaretler. Girdi JSON grammar’a uyduğu halde schema’ya uymaz. quantity=5 ise type bakımından uygundur ama operation kuralına uymaz. İncelemede parse success, field/type success ve domain success ayrı tutulmalıdır. Artifact’teki üç dalın farklı sonuçları, reddin hangi kontrol tarafından verildiğini gösterir.
Client UI, quantity için bir dropdown sunsa bile server kendi 1–3 kuralını uygulamalıdır. Form control state ile request body’deki value farklı olabilir. Public preview örneği, son kararın local uygulama kuralına ait olduğunu gösterir. JSON schema’nın başarılı olması, caller’ın bir private record’a erişim hakkı olduğu sonucuna dönüştürülemez.
Aynı görünen title aynı byte değildir
Composed ve decomposed Café örnekleri, ekrandaki görünüş ile raw equality arasındaki farkı gösterir. NFC, bu iki örneğin comparison representation’ını birleştirir; bütün Unicode string’lerin eşit sayılması anlamına gelmez. Fullwidth A için NFC’nin ayrımı koruması, normalization seçiminin business semantics ile ilgili olduğunu hatırlatır.
Title doğru normalize edilmiş olsa da onu alan API, value yerine source yorumlayabilir. Literal title, HTML text serialization ve query’nin value slot’u bu yüzden farklı yeteneklere sahiptir. html.escape ile elde edilen sonuç yalnız ilgili HTML text context için değerlendirilir. Bu gözlem bir browser sanitizer’ın, SQL engine’in veya command parser’ın davranışını göstermez.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Unicode form
- Normalization representation seçildi
representations decomposed Café ve composed Café değerlerini ayrı taşır. Aynı görünüm raw byte veya code-point equality’si değildir.
- Input/representation record
- Two Café representations
- Validation review
- NFC karşılaştırılmadı
- Evidence conclusion
- Business equality bilinmiyor
- Selected NFC policy okundu
Profile titleNormalization=NFC seçer; accepted normal record title=Café olur. Bu selected policy aynı canonical temsil üzerinden downstream comparison kurar.
- Input/representation record
- Decomposed title input
- Validation review
- NFC result=Café
- Evidence conclusion
- Selected normalization known
- Compatibility form ayrımı okundu
Fullwidth A için NFC output A kalır, NFKC output A olur. NFC ve NFKC bütün input’larda aynı business semantics’i taşımaz.
- Input/representation record
- Fullwidth A
- Validation review
- NFC=A; NFKC=A
- Evidence conclusion
- Forms not interchangeable
- Normalization encoding sayılmadı
Tea & Bread için HTML text serialization Tea & Bread’dir. Bu output context dönüşümü NFC’nin veya record key’inin yerine kullanılmaz.
- Input/representation record
- Unicode domain representation
- Validation review
- HTML text representation separate
- Evidence conclusion
- No universal encoder claim
- Consumer permission ayrıca bırakıldı
Doğru normalize title private record access veya caller identity kanıtı değildir. Bu profile public preview içindir; API permission sonucu üretilmez.
- Input/representation record
- Known: selected representations
- Validation review
- Validation/normalization separate
- Evidence conclusion
- Authorization not established
- Representation hükmü scope’unda kaldı
Artifact normalization ve text serialization çıktıları açıklanır. Browser display, sanitizer, SQL veya command interpreter behavior bu değerlerden doğrulanmış sayılmaz.
- Input/representation record
- Known: NFC/NFKC distinction
- Validation review
- Known: HTML text transformation
- Evidence conclusion
- Other consumers require evidence
Input eksik
- Missing evidence scope seçildi
missingEvidence.raw=null verilmiştir. Normal raw input’un sonradan bu boşluğa yerleştirildiği varsayılmaz.
- Input/representation record
- Raw=null
- Validation review
- Parse evidence yok
- Evidence conclusion
- Preview bilinmiyor
- Byte budget önkoşulu ayrıldı
Body bütçesi parse’den önce değerlendirilir; raw yokken byte limit’in geçtiği söylenmez. Field type ve domain predicate’leri de bu kanıtı tamamlayamaz.
- Input/representation record
- Raw=null
- Validation review
- Budget/parse not computed
- Evidence conclusion
- Preview bilinmiyor
- Unknown ile parse rejection ayrıldı
decision=NOT-COMPUTED input yokluğunu korur. Bu durum malformed JSON veya known schema rejection reason’ı olarak yeniden adlandırılmaz.
- Input/representation record
- Raw=null
- Validation review
- Decision NOT-COMPUTED
- Evidence conclusion
- No rejection cause inferred
- Record construction yapılmadı
previewRecord=null kalır. Source evidence olmadan title, quantity veya reviewed state’i guessed success olarak oluşturulmaz.
- Input/representation record
- Raw=null
- Validation review
- No accepted field evidence
- Evidence conclusion
- PreviewRecord=null
- Input ve accepted projection istendi
Raw bytes, parsed types ve consumer decision ayrı source’larla gerekir. Sadece UI’da Café/2 görünmesi bu local decision chain’ini tamamlamaz.
- Input/representation record
- Missing input known
- Validation review
- Raw/type/decision evidence required
- Evidence conclusion
- No accepted preview
- Missing input hükmü sınırlandı
Bu branch’te hesap yapılmadığı bilinir; input’un valid veya invalid olduğu bilinmez. Event loss veya kötü niyetli caller teşhisi ayrıca evidence ister.
- Input/representation record
- Known: input absent
- Validation review
- Known: not computed
- Evidence conclusion
- UNKNOWN: input validity
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Bir accepted representation contract’ı kur
Public preview contract’ı iki alanı, kesin türleri, quantity aralığını ve NFC sonrasındaki title uzunluğunu birlikte tanımlar. Eksik alan, extra field ve null için açık sonuçlar gerekir. Byte limit parse’den önce; type ve domain kuralları parse edilmiş value’lar üzerinde uygulanır. Python’da bool ile int arasındaki inheritance ilişkisi, API’nin quantity type’ını belirlemez: bu profil boolean kabul etmez. Eksik girdiden tahmini bir record üretilmez.
Kabul edilen record için normalization bir kez uygulanır; sonraki aşamalar aynı title’ı kullanır. Duplicate member rejection, uygulamanın seçtiği policy’dir; bütün JSON implementation’larının aynı davranacağı varsayılmaz. O’Reilly gibi normal punctuation içeren title’lar kabul edilebilir. Validation’ı punctuation blacklist’ine çevirmek, query structure ile value ayrımını çözmediği gibi normal içeriği de kaybettirebilir.
Sonucu ayrı artifact alanlarından doğrula
Normal girdi için previewRecord Café/2; yanlış tür için schema rejection; quantity=5 için domain rejection; reviewed alanı için closed-shape rejection beklenir. Son üç durumda record null kalır. Parsed type, normalized title ve HTML text representation ayrı alanlardan okunmalıdır. Bir aşamanın başarılı sonucu, diğerinin başarı kanıtı olarak kullanılamaz.
Local sahnenin başlangıcında preview record hazır değildir. Byte budget, parse, schema ve domain adımları tamamlandıkça bilinen sonuç değişir. Output encoding’i database key gibi saklamak yerine raw, domain ve sink representation’larını ayrı tut. Bu örnek HTTP handler, browser display, sanitizer veya user permission doğrulaması göstermez; her birinin kendi boundary’si ayrıca değerlendirilir.
ŞİMDİ VAKAYA UYGULA
Grammar, type, domain ve representation nerede ayrılır?
Harmless public preview JSON’u consumer rule’ü geçmek zorundadır. Unicode normalization ve output encoding farklı amaçlar taşır; missing raw input guessed success olmaz.
Vakadaki input, server işleme ve response için karar sırasını çıkar. Parsed veya valid data ile completed operation aynı sonuç değildir; hangi owner’ın hangi koşulu değerlendirdiğini belirt.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Atlas preview representation ledger
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"profile": {
"rawByteLimit": 128,
"keys": [
"title",
"quantity"
],
"titleNormalization": "NFC",
"titleCodePoints": [
1,
40
],
"quantityRange": [
1,
3
],
"publicPreviewOnly": true
},
"raw": {
"normal": "{\"title\":\"Café\",\"quantity\":2}",
"wrong-type": "{\"title\":\"Café\",\"quantity\":\"two\"}",
"domain-limit": "{\"title\":\"Café\",\"quantity\":5}",
"extra-field": "{\"title\":\"Café\",\"quantity\":2,\"reviewed\":true}"
},
"expected": {
"normal": {
"decision": "ACCEPT",
"reason": "public-preview-valid",
"schemaValid": true,
"domainValid": true,
"previewRecord": {
"title": "Café",
"quantity": 2
},
"parsed": true,
"normalizedTitle": "Café"
},
"wrong-type": {
"decision": "REJECT",
"reason": "field-type",
"schemaValid": false,
"domainValid": false,
"previewRecord": null,
"parsed": true,
"normalizedTitle": null
},
"domain-limit": {
"decision": "REJECT",
"reason": "domain-range",
"schemaValid": true,
"domainValid": false,
"previewRecord": null,
"parsed": true,
"normalizedTitle": "Café"
},
"extra-field": {
"decision": "REJECT",
"reason": "closed-shape",
"schemaValid": false,
"domainValid": false,
"previewRecord": null,
"parsed": true,
"normalizedTitle": null
}
},
"representations": {
"decomposedTitle": "Café",
"composedTitle": "Café",
"htmlTextInput": "Tea & Bread",
"htmlTextSerialized": "Tea & Bread",
"fullwidthA": "A",
"NFCFullwidthA": "A",
"NFKCFullwidthA": "A"
},
"missingEvidence": {
"raw": null,
"decision": "NOT-COMPUTED",
"previewRecord": null
}
}- raw
- Fixed ordinary JSON text; byte admission parse’den ayrıdır.
- schemaValid / domainValid
- Fields/types ile operation range ayrı kapılardır.
- previewRecord
- Accepted NFC title ve quantity; rejected branch’te null.
- representations
- Raw, normalized ve HTML text serialized biçimleri aynı değildir.
Küçük JSON object’ler, Unicode normalization ve HTML text serialization için sınırları belirlenmiş local örneklerdir. HTTP handler, browser, sanitizer, SQL/command interpreter ve user authorization davranışı gösterilmez; bütün parser resource limit’leri için genel garanti verilmez.
İki yanlış kanı
Valid JSON, valid business operation demektir.
Grammar, schema, domain ve authorization ayrı kararlar ister.
Normalize veya escape edilen string bütün sink’lerde güvenlidir.
Normalization eşitlik seçer; encoding context’e, parameterization yapı/value ayrımına aittir.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
quantity=5 integer; schemaValid=true, fakat izinli range 1–3. Public preview kaydı oluşturulur mu?
- Hayır. domainValid=false; previewRecord=null.
- Evet. Integer olan her quantity kabul edilir.
Gerekçeli cevabı oku
Hayır. domainValid=false; previewRecord=null. — Number type doğru olsa da miktar sınırı aşılmıştır. Schema başarısı business/domain koşulunu geçerli yapmaz.
JSON parse edilmiş, fakat reviewed alanı sözleşmede yok. Bu closed-shape policy’si alanı sessizce silip preview kabul eder mi?
Dersten seçilen artifact alanları; öğretim örneği
- profile.keys
- ["title","quantity"]
- raw.extra-field
- {"title":"Café","quantity":2,"reviewed":true}
- expected.extra-field
- {"decision":"REJECT","reason":"closed-shape","schemaValid":false,"domainValid":false,"previewRecord":null,"parsed":true,"normalizedTitle":null}
- Evet. JSON syntax doğruysa bütün ek alanlar güvenilen metadata olur.
- Hayır. closed-shape sonucu REJECT.
Gerekçeli cevabı oku
Hayır. closed-shape sonucu REJECT. — İzinli key’ler title ve quantity. parsed=true, input’un schema’ya uygun olduğu anlamına gelmez; previewRecord=null kalır.
Café NFC ile Café oluyor; fullwidth A NFC’de aynı, NFKC’de A. Normalization neden HTML encoding veya permission değildir?
Gerekçeli cevabı oku
NFC ve NFKC farklı normalization kurallarıdır; hangi biçimin kullanılacağı sözleşmede belirlenmelidir. Birleşen karakter representation’ı, title type/range veya authorization kontrolünü kaldırmaz. HTML text encoding ise Tea & Bread verisini Tea & Bread olarak temsil eder; normalization’dan ayrı context işlemidir. Input eksikse karar NOT-COMPUTED kalır.
□ NFC ile NFKC sonuçlarını eşitlemedim.
□ Normalization, encoding ve permission rollerini ayırdım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- OWASP — Input Validation Cheat SheetIntroduction · Input Validation Strategies · Parse Safely, Then Validate · Validate Structured Data · Validating Free-form Unicode Text
- RFC 8259 — JSON4 Objects · 9 Parsers
- Python — jsonjson.loads / object_pairs_hook / parse_constant · Repeated Names Within an Object
- Unicode Standard Annex #15 — Normalization Forms1.2 Normalization Forms; compatibility distinctions
- Python — unicodedataunicodedata.normalize
- Python — htmlhtml.escape
- OWASP — Injection Prevention Cheat SheetRemediation: Defense Option 1: Prepared Statements (with Parameterized Queries)