1

フォームにテキスト フィールドがあり、HTML コードと < > 文字を含むコードを含めることができます。これをデータベースに保存したいのですが、最初にエンコードして、[allowHtml} を実行しなくても安全に受け入れられるようにします。

データを送信するために使用するコードは次のとおりです。一度に 1 つのフィールドを送信するだけで、html コードを含む場合と含まない場合があるデータが javascript val変数にあることに注意してください。

   $.ajax({
        cache: false,
        url: "/Admin/" + obj.table + "s/JsonUpdate",
        dataType: 'json',
        type: 'POST',
        data: { pk: pk, rk: rk, fld: type, val: val }
    })

サーバー側コントローラーには、次のコードがあります。

   [HttpPost]
   public JsonResult JsonUpdate(string pk, string rk, string fld, string val) {
   Content content = null;
            try {
                if (fld == "TempRowKey") {

viewModel と [AllowHTML] を使用することを提案しましたが、データがエンコードされている場合、なぜ [AllowHtml] を使用する必要があるのでしょうか。

を送信しようとしたときに起こったことは次のとおり<x>です。送信されたデータは次のとおりです。

pk=0006000&rk=0100&fld=Notes&val=%3Cx%3E

次に、サーバーは次のように応答しました。

 Server Error in '/' Application
 A potentially dangerous Request.Form value was detected from the client (val="<x>"). 
4

2 に答える 2

1

contentTypeオーバーライドしない限り、またはjQuery.ajaxprocessDataリクエストをオーバーライドしない限り(あなたの例ではそうしません)、送信されたデータはデフォルトで urlencoded になります:

サーバーにデータを送信するときは、この [設定する] コンテンツ タイプを使用します。デフォルトは「application/x-www-form-urlencoded; charset=UTF-8」で、ほとんどの場合はこれで問題ありません。

これは、Firebug などを使用して送信されたリクエストを検査することで確認できます。

アップデート:

を持たないという制限を回避しようとしているようです[AllowHTML]。そもそも使用しない理由が何であれ、送信されたデータを手動でencodeURIにしてから、サーバーでこれを元に戻すことができます。

フォローアップの質問について...しかし、データがエンコードされている場合、なぜ [AllowHtml] を使用する必要があるのですか?

データが で送信されるとjQuery.ajax、そのコンテンツ タイプはデフォルトで に設定さapplication/x-www-form-urlencodedれます。このエンコーディングは転送中にのみ適用されます。実際のデータではなく、データの表現が urlencoded であると考えてください。これはどう違うのですか?サーバーはリクエストを受信すると、コンテンツ タイプを認識し、それをデコードしてから、さらに処理 (および検証) を行います。基本的に、プロトコル レベルでのデータ転送の下位レベルの処理は、記述したコードの外側のフレームワークによって処理されます。

送信前にクライアントでデータを手動でエンコードすると、危険な値を検出せずにサーバー アプリケーションがデータを受け取る方法になります。転送中、文字列は事実上二重にエンコードされたように見えますが、最終結果には影響しません。

于 2012-08-05T05:18:50.997 に答える
1

でビューモデルを使用[AllowHtml]し、データベースに保存する前に必要に応じてエンコードします。しかし、なぜわざわざ?データベースにそのまま保存し、データベースに保存された値を Web ページに出力するときは、単純に HTML エンコードします。これは、@Razor オペレーターが既定で行うことです。

于 2012-08-05T05:31:36.297 に答える