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 SPACESpace_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-8gönderiyorsa bunu kullanabilirsiniz. Ham UnsafeRelaxedJsonEscaping çıkışın bir HTML sayfasına veya <script> öğesine hiçbir zaman yayılmamasına izin verme.

Ayrıca bkz.