アプリケーションで.NET Framework(.NET Framework 4.5.2を対象とする)によって提供されるSystem.Web.Security.AntiXss.AntiXssEncoderクラスを使用していますが、アラビア文字を含むフィールドに関する問題が発生しています。アラビア文字がAntiXssEncoderによって再エンコードされないようにするにはどうすればよいですか?
次のコンソールアプリケーションでは、我々が持っている問題を示しています
using System;
using System.Collections.Generic;
using System.Web.Security.AntiXss;
namespace EncodingTest
{
class Program
{
static void Main(string[] args)
{
var source = new List<string> { "Hello World", "على", "blöd", "الم" };
foreach (var testString in source)
{
var antiXssEncoded = AntiXssEncoder.HtmlEncode(testString, false);
Console.WriteLine($"{testString} => {antiXssEncoded}");
Console.WriteLine();
}
Console.ReadKey();
}
}
}
2番目のリスト項目でアラビア語の文字が正しくエンコードされますが、前後の要素で既にエンコードされた文字は、エンコーダを通過している場合は、 '&'文字は2回目に&
にエンコードされ、次にウェブページに正しく表示されません。
アプリケーションからのこの出力は、(エンコードされていないアラビア文字がコンソールに「???」と表示される)、これを示しています
Hello World => Hello World
??? => على
blöd => blöd
الم => &#1575;&#1604;&#1605;
はこれを防ぐ方法はありますか?
現在、ユーザ入力を受け取り、データベースに保存する前にエンコーダで渡します。このエンコードされたデータはフロントエンドに送信され、表示されます。ユーザーが文字列を編集し、それを私たちのバックエンドに戻すと、それを保存する前に再度エンコードするので、アンパサンドで問題が発生します。
他の質問については、入力時にユーザー入力をデータベースに保存してから、表示用に送信する前にエンコーダを通過させる必要があるとの意見がありました。私たちはこれを行うことができましたが、データが出力されるすべての場所でこれがコード化されていることを確認する必要がありました。編集されたデータがフロントエンドから戻ってくるという問題には役に立たないでしょう。データがエンコードされているかどうかはまだ分かりませんし、次に表示されるときにエンコードするだけです。
エンコーダにا
のような文字を再エンコードしないようにする方法はありますか?&#1575;
に入力するか、何か間違っているだけですか?
文字列がエンコードされているかどうかを常に知っておく必要があります。ダブルエンコーディングの問題を防ぐ唯一の方法は、エンコードすることがわかっている文字列を再エンコードしないことです。もちろん、データベース*には、エスケープされていない生の値が含まれているべきです。なぜなら、代わりに、あなたが "على"を調べようとしているときにデータベースコードがHTMLエンコーディングについて突然知っていなければならないからです。表示と転送のために文字列を正しくエンコードすることは、常にフロントエンドの責任です。 –
ありがとう@jeroenmostert - これは理にかなっており、私たちがやっていることは間違っている –