0

正しく送信されない特殊文字を回避するさまざまな方法についての投稿をいくつか見ました。しかし、私はより良い、よりシンプルなソリューションを望んでいました (見つからない可能性があります)。

オブジェクトを渡す機能もあります。オブジェクト (myObject) には、特殊な番号付き文字 (Bill & #8217;s、右側の一重引用符、特殊な番号付き文字) を含むテキストが含まれる場合があります。

データを送信しようとすると、チョークします。そのため、コードを調べて、ユーザー入力を受け入れる場所はすべてエスケープし、情報が表示される場所はエスケープしませんでした。

問題:

  • ユーザー入力を表示または受け入れる場所が欠落している可能性があります。
  • データはエスケープされた文字と共に保存されます。

特殊文字がサニタイズされるソリューションを見てきましたが、特殊文字のリストが必要になります。または、エスケープされた文字をバックエンドでデコードすることもできます。

  • バックエンド - MVC .net C#
  • jQuery バージョン: 1.7.2

    var json = $.toJSON(myObject);
    
    $.ajax({
        type: 'POST',
        url: RootUrl + "Viewer/Save/",
        data: { "json": json },
        async: false,
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            var $("#display").(data);
        },
        error: function (xhr, status, error) {
            alert(error);
        }
    });
    

詳しくは:

json 文字列は MVC コントローラーに渡されます。メソッドは次のようになります。

public ContentResult Save(string json)
{
    try
    {
        dynamic data = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<dynamic>(json);
    }
    catch (Excepteion ex)
    {
         // More code
    }
}

Chrome デバッガーを使用しているときに表示されるエラー メッセージは次のとおりです。

  • 500内部サーバーエラー)

もっと考えてみると、特殊な番号付き文字を受け入れるために変更する必要があるバックエンドの設定があるかどうか疑問に思っています。これを言う理由は、MVC コントローラー メソッドの先頭にブレーク ポイントを設定すると、実際にはブレーク ポイントに到達しないためです。ただし、エスケープしたり、アポストロフィ記号を使用したりしても問題ありません。

私は引き続き検索し、調査結果を返信します。

アップデート

情報に従ってください: 「潜在的に危険な Request.Path 値がクライアント (&) から検出されました」の取得

    [ValidateInput(false)]
    [HttpPost]
    public ContentResult SaveTailoring(string json)

これをコードに追加すると、データをコントローラーに入れるという問題が解決しました。私はもっ​​と研究するつもりであり、この手法の長所と短所についての考えをいただければ幸いです.

4

1 に答える 1

0

ApiController でこれを試したい場合はmyObject、サーバー コードで呼び出されたクラスと JavaScript での対応する表現があると仮定すると、次のようになります。

public ContentResult Save(string json)
{
    try
    {
        dynamic data = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<dynamic>(json);
    }
    catch (Excepteion ex)
    {
         // More code
    }
}

このようなものになり、ネイティブ型と合理的にシームレスに作業できるようになります

public class myObjectController : ApiController
{
    // ... code for GET/PUT/DELETE versions omitted ...

    // POST api/myObject
    public myObject PostmyObject(myObject myObject)
    {
        // code to save and update myObject
        return myObject;
    }
}

ただし、自動作成された REST メソッドは通常、ステータスと、新しく保存されたオブジェクトの get へのリンクを提供するヘッダーを持つHttpResponseMessagefor を返します。POST

于 2013-05-17T21:14:24.230 に答える