MVC, JQUERY, AJAX, HTML-кодированный ответ JSON - PullRequest
1 голос
/ 22 июля 2011

Этот вопрос задавался ранее, но я должен понять, что я не нашел реального / лучшего способа сделать это!

Проблема в том, что я хочу закодировать ответ, полученный от вызова AJAX, чтобы предотвратить атаки межсайтового скриптинга (XSS). У меня есть форма с текстовым полем и кнопкой отправки. При отправке значение публикуется на сервере и возвращается клиенту. Здесь мне нужно HTML закодировать ответ, как сообщение, например может быть "alert ('Hello')" и т. д.

Как мне кодировать item.Message в следующем?

View

$(document).ready(function () {

    $("form[action$='SubmitChatMessage']").submit(function () {
        $.ajax({
            url: $(this).attr("action"),
            type: "post",
            dataType: "json",
            data: $(this).serialize(),
            success: function (response) {
                $("#chatMessages").empty();

                var chatMessages = "";
                $.each(response, function (i, item) {
                    chatMessages += '<div>' + item.Message + '</div>';
                });

                $("#chatMessages").html(chatMessages);
                $("#message").val(''); // Clear the textbox value
            }
        });
        return false;
    });
});

<div id="chatContent">
    <% using(Html.BeginForm("SubmitChatMessage", "ProductDetails"))
       {%>
    <%: Html.TextBox("message")%>
    <%: Html.Hidden("productId", Model)%>
    <input type="submit" value="Tilføj" />
    <% }%>
    <div id="chatMessages">
    </div>
</div>

Действие контроллера

[HttpPost]
[ValidateInput(false)]
public JsonResult SubmitChatMessage(string message, Guid productID)
{

    // 1. Store message in db

    // 2. Fetch messages from db
    List<Message> chats = DB.GetMessages(productID);
    var json = (from c in chats 
               select new {Message = c.Message, CreatedDate = c.Created});

    return Json(json);
}

Надеюсь получить ответ, это сводит меня с ума! Подобный вопрос был задан здесь , но я не вижу, как использовать .text в моем случае.

UPDATE: Это действительно решение?

Ответы [ 2 ]

4 голосов
/ 23 июля 2011

Попробуй так:

success: function (response) {
    var messages = $('#chatMessages');
    messages.empty();

    $.each(response, function (i, item) {
        messages.append(
            $('<div/>', {
                text: item.Message
            })
        );
    });

    $('#message').val(''); // Clear the textbox value
}
1 голос
/ 11 сентября 2014

В качестве альтернативы вы можете использовать что-то вроде HttpUtility.HtmlEncode в действии контроллера.

var json = (from c in chats 
           select new {
               Message = HttpUtility.HtmlEncode(c.Message), 
               CreatedDate = c.Created
           });

return Json(json);
...