2011-07-22 95 views
1

这个问题之前已经被问到过,但我必须意识到,我没有找到真正的/最好的方式来做到这一点!MVC,JQUERY,AJAX,HTML编码JSON响应

问题是,我想编码从AJAX调用中获得的响应,以防止跨站点脚本攻击(XSS)攻击。我有一个带有文本框和提交按钮的表单。提交时,该值将发布到服务器并返回给客户端。在这里,我需要对html响应进行编码,如可能是“alert('Hello')”等。

如何编码item.Message以下内容?

查看

$(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); 
} 

希望得到的答案,这是推动我疯了! 类似的问题被给出here,但我不能看到如何在我的情况下使用.text。

UPDATE: Is this really the solution?

回答

4

尝试这样的:

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 
} 
+0

你能解释一下什么文字:item.Message是指在这里吗? – Nima

+0

@Nima,它使用['.text()'](http://api.jquery.com/text/)方法来设置新创建的div的内容,并负责正确的HTML编码值与'.html()'方法相反)。 –

+0

非常感谢。这工作。我可以看到,“这真的是解决方案吗?”中提到了这一点。我已发布在更新部分的链接。但是,谢谢,这不是你第一次帮我解答:) – Nima

1

另外,您可以在控制器的动作使用类似HttpUtility.HtmlEncode

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

return Json(json);