ile karakter kodlamayı özelleştirme System.Text.Json
Varsayılan olarak, seri hale getirici ASCII olmayan tüm karakterlerden kaçar. Yani, karakterlerin Unicode kodunun olduğu yerle \uxxxx
xxxx
değiştirir. Örneğin, aşağıdaki JSON dosyasındaki özelliği Kiril жарко
WeatherForecast
olarak ayarlanırsaSummary
, nesne bu örnekte gösterildiği gibi serileştirilir:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Summary": "\u0436\u0430\u0440\u043A\u043E"
}
Dil karakter kümelerini seri hale getirme
Bir veya daha fazla dilin karakter kümelerini kaçış yapmadan seri hale getirmek için, aşağıdaki örnekte gösterildiği gibi örneğini System.Text.Encodings.Web.JavaScriptEncoderoluştururken Unicode aralıkları belirtin:
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;
Imports System.Text.Encodings.Web
Imports System.Text.Json
Imports System.Text.Unicode
var options1 = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.Cyrillic),
WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, options1);
options = New JsonSerializerOptions With {
.Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.Cyrillic),
.WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast1, options)
Bu kod Kiril veya Yunanca karakterlerden kaçmıyor. Summary
Özelliği Kiril жарко
WeatherForecast
olarak ayarlanırsa, nesne bu örnekte gösterildiği gibi serileştirilir:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Summary": "жарко"
}
Kodlayıcı varsayılan olarak aralığıyla BasicLatin başlatılır.
Kaçış yapmadan tüm dil kümelerini seri hale getirmek için kullanın UnicodeRanges.All.
Belirli karakterleri seri hale getirme
Alternatif olarak, kaçış olmadan izin vermek istediğiniz karakterleri tek tek belirtebilirsiniz. Aşağıdaki örnek yalnızca ilk iki karakterini жарко
serileştirir:
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;
Imports System.Text.Encodings.Web
Imports System.Text.Json
Imports System.Text.Unicode
var encoderSettings = new TextEncoderSettings();
encoderSettings.AllowCharacters('\u0436', '\u0430');
encoderSettings.AllowRange(UnicodeRanges.BasicLatin);
var options2 = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(encoderSettings),
WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, options2);
Dim encoderSettings As TextEncoderSettings = New TextEncoderSettings
encoderSettings.AllowCharacters(ChrW(&H436), ChrW(&H430))
encoderSettings.AllowRange(UnicodeRanges.BasicLatin)
options = New JsonSerializerOptions With {
.Encoder = JavaScriptEncoder.Create(encoderSettings),
.WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast1, options)
Yukarıdaki kod tarafından üretilen bir JSON örneği aşağıda verilmişti:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Summary": "жа\u0440\u043A\u043E"
}
Listeleri engelle
Yukarıdaki bölümlerde, kaçış olmasını istemediğiniz kod noktalarının veya aralıkların izin verilenler listesinin nasıl belirtileceği gösterilmektedir. Ancak, izin verme listenizdeki belirli kod noktalarını geçersiz kılabilir genel ve kodlayıcıya özgü blok listeleri vardır. Blok listesindeki kod noktaları, izin verilenler listenize dahil edilse bile her zaman kaçış noktası olarak kullanılır.
Genel blok listesi
Genel blok listesi özel kullanım karakterleri, denetim karakterleri, tanımsız kod noktaları ve hariç U+0020 SPACE
Space_Separator kategorisi gibi belirli Unicode kategorileri gibi öğeleri içerir. Örneğin, U+3000 IDEOGRAPHIC SPACE
izin verenler listenize Unicode aralığı CJK Sembolleri ve Noktalama işaretleri (U+3000-U+303F) belirtseniz bile kaçış olur.
Genel blok listesi, .NET'in her sürümünde değiştirilen bir uygulama ayrıntısıdır. Genel blok listesinin üyesi olan (veya üyesi olmayan) bir karaktere bağımlılık almayın.
Kodlayıcıya özgü blok listeleri
Kodlayıcıya özgü engellenen kod noktalarına örnek olarak '<'
'&'
HTML kodlayıcı, '\'
JSON kodlayıcı ve '%'
URL kodlayıcısı verilebilir. Örneğin, ve işareti aralıkta BasicLatin
olsa ve tüm kodlayıcılar varsayılan olarak ile BasicLatin
başlatılmış olsa bile, HTML kodlayıcı her zaman ve işaretinden ('&'
kaçışı oluşturur).
Tüm karakterleri seri hale getirme
Kaçışı en aza indirmek için, aşağıdaki örnekte gösterildiği gibi kullanabilirsiniz JavaScriptEncoder.UnsafeRelaxedJsonEscaping:
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;
Imports System.Text.Encodings.Web
Imports System.Text.Json
Imports System.Text.Unicode
var options3 = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, options3);
options = New JsonSerializerOptions With {
.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
.WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast1, options)
Dikkat
Kodlayıcı, varsayılan kodlayıcıya kıyasla karakterlerin UnsafeRelaxedJsonEscaping
ayarsız geçişine izin verme konusunda daha fazla izin verir:
- ,
>
,&
ve'
gibi<
HTML duyarlı karakterlerden kaçmaz. - XSS'ye karşı ek derinlemesine koruma veya istemci ile sunucunun karakter kümesinde anlaşamamasından kaynaklanabilecek bilgiler gibi bilgilerin açığa çıkması saldırılarına karşı herhangi bir ek koruma sunmaz.
Güvenli olmayan kodlayıcıyı yalnızca istemcinin sonuçta elde edilen yükü UTF-8 kodlanmış JSON olarak yorumlayacak olduğu biliniyorsa kullanın. Örneğin, sunucu yanıt üst bilgisini Content-Type: application/json; charset=utf-8
gönderiyorsa bunu kullanabilirsiniz. Ham UnsafeRelaxedJsonEscaping
çıkışın bir HTML sayfasına veya <script>
öğesine hiçbir zaman yayılmamasına izin verme.