Karakterkódolás testreszabása System.Text.Json
Alapértelmezés szerint a szerializáló az összes nem ASCII-karaktert feloldja. Ez azt jelzi, hogy \uxxxx
hol xxxx
található a karakter Unicode-kódja. Ha például a Summary
következő JSON tulajdonság cirill жарко
betűsre van állítva, az WeatherForecast
objektum szerializálva lesz az alábbi példában látható módon:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Summary": "\u0436\u0430\u0440\u043A\u043E"
}
Nyelvi karakterkészletek szerializálása
Ha egy vagy több nyelv karakterkészletét anélkül szeretné szerializálni, hogy el szeretne menekülni, adja meg a Unicode-tartomány(ok) t a példány System.Text.Encodings.Web.JavaScriptEncoderlétrehozásakor, ahogyan az az alábbi példában látható:
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)
Ez a kód nem menekül a cirill vagy görög karakterek elől. Ha a Summary
tulajdonság cirill жарко
betűsre van állítva, az WeatherForecast
objektum szerializálva lesz az alábbi példában látható módon:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Summary": "жарко"
}
Alapértelmezés szerint a kódoló inicializálva van a BasicLatin tartománnyal.
Ha az összes nyelvi készletet anélkül szeretné szerializálni, hogy menekülni szeretne, használja a következőt UnicodeRanges.All: .
Adott karakterek szerializálása
Másik lehetőségként megadhatja azokat az egyéni karaktereket, amelyeket át szeretne adni a feloldás nélkül. Az alábbi példa csak az első két karaktert szerializálja жарко
:
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)
Íme egy példa az előző kód által létrehozott JSON-ra:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Summary": "жа\u0440\u043A\u043E"
}
Listák blokkolása
Az előző szakaszok bemutatják, hogyan adható meg azoknak a kódpontoknak vagy tartományoknak a listája, amelyeket nem szeretne kihagyni. Vannak azonban globális és kódolóspecifikus blokklisták, amelyek felülírhatnak bizonyos kódpontokat az engedélyezési listában. A blokklisták kódpontjai mindig ki vannak tiltva, még akkor is, ha szerepelnek az engedélyezési listában.
Globális blokklista
A globális blokklista olyan elemeket tartalmaz, mint a magánhasználatú karakterek, a vezérlőkarakterek, a nem definiált kódpontok és bizonyos Unicode-kategóriák, például a Space_Separator kategória, kivéve U+0020 SPACE
. A rendszer például akkor is elkerüli a kódot, U+3000 IDEOGRAPHIC SPACE
ha engedélyezési listaként Unicode-tartomány CJK-szimbólumokat és írásjeleket (U+3000-U+303F) ad meg.
A globális blokklista egy implementálási részlet, amely a .NET minden kiadásában megváltozott. Ne függjön attól, hogy egy karakter a globális blokklista tagja (vagy nem tagja) legyen.
Kódolóspecifikus blokklisták
A kódoló-specifikus blokkolt kódpontok közé tartozik '<'
'&'
például a HTML-kódoló, '\'
a JSON-kódoló és '%'
az URL-kódoló. A HTML-kódoló például mindig menekül az ampersands ('&'
) elől, annak ellenére, hogy az ampersand a BasicLatin
tartományban van, és az összes kódoló alapértelmezés szerint inicializálva BasicLatin
van.
Az összes karakter szerializálása
A menekülés minimalizálása érdekében használhatja JavaScriptEncoder.UnsafeRelaxedJsonEscapinga következő példában látható módon:
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)
Figyelemfelhívás
Az alapértelmezett kódolóhoz képest a UnsafeRelaxedJsonEscaping
kódoló megengedőbb, hogy lehetővé teszi a karakterek számára, hogy a kódolatlanokon áthaladjanak:
- Nem szabadul fel a HTML-érzékeny karakterek, például
<
a ,>
,&
és'
. - Nem nyújt további részletes védelmet az XSS-sel vagy az információfeltárási támadásokkal szemben, például azokat, amelyek az ügyfél és a kiszolgáló által a karakterkészleten nem értünk egyet.
A nem biztonságos kódolót csak akkor használja, ha ismert, hogy az ügyfél az eredményül kapott hasznos adatokat UTF-8 kódolású JSON-ként értelmezi. Használhatja például, ha a kiszolgáló elküldi a válaszfejlécet Content-Type: application/json; charset=utf-8
. Soha ne engedélyezze a nyers UnsafeRelaxedJsonEscaping
kimenet HTML-lapba vagy elembe való kibocsátását <script>
.
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: