0

我在表单中有一个“描述”字段。我希望用户不被限制在此字段中使用特殊字符。

因此,我希望能够将以下数据从我的客户端发布到我的服务器,保存到数据库,并能够再次正确呈现:

测试说明 ( & &%$^&^() ^&&$& 87566467679089765 ?<>?<>?<>?<>":";';';'][][][][{}{} {}

我对该主题进行了一些阅读,但似乎我的选择比我预期的要多。为了安全起见,我想确保我正确地执行此操作。

在我的模型中,我使用 AllowHtml 属性标记了我的 Description 属性:

[DisplayFormat(ConvertEmptyStringToNull = false), AllowHtml]
public string Description { get; set; }

这允许将上述数据发布到我的控制器,但不能解决问题的核心。我现在相信我需要清理我的输入。我相信这意味着我需要利用 HttpUtility 库。

查看 HttpUtility,我看到了很多方法:

  • HtmlAttributeEncode
  • html编码
  • 网址编码

根据这篇文章,HtmlEncode 和 UrlEncode 之间似乎没有太大区别。

我想知道几件事:

  • 在这里使用 HttpUtility 是正确的选择吗?
  • 在 POST 之前不对我的输入进行任何处理可以吗?(我可以在服务器端进行所有编码吗?)
  • 我应该使用 Microsoft 反 xss 库而不是 HttpUtility 吗?

以及通常我可能不会被告知的任何其他陷阱。

更新:

这是我的模型:

<div class="detailsRow optional">
    <%= Html.LabelFor(model => model.Description, new { @class = "descriptionLabel" }, Model.DescriptionLabel)%>
    <%= Html.TextAreaFor(model=> model.Description) %>
</div>

和我的控制器方法:

public ActionResult SaveNewOrderDetails(NewOrderDetailsModel orderDetailsModel)
{
    string description = orderDetailsModel.Description;
    //Successfully got description
    //Example code:
    Order order = new Order(description);
    order.Save();

    return Json(new { id = order.ID, name = order.Name });
}

在我的代码通过“return Json”语句后,我遇到了另一个错误:

从客户端检测到潜在危险的 Request.Form 值 (Description="...>?<>?<>?<><?>":";';';'][][][][. ..”)。

我的理解是这不应该发生。我应该检查哪些地方?

UPDATE2:无法让 AllowHtml 工作。当我们升级到 MVC4 时,我将重新讨论这个问题。

4

1 回答 1

2

我现在相信我需要清理我的输入。

不,就接收用户输入并将其存储到数据库中而言,您很好(假设您使用了应该始终执行的参数化查询)。该[AllowHtml]属性将使您可以输入任何字符。如果您想清理用户可以输入的字符,只需使用正则表达式验证器(我可能不会为此烦恼):

[DisplayFormat(ConvertEmptyStringToNull = false)]
[AllowHtml]
[RegularExpression("PUT YOUR REGEX HERE")]
public string Description { get; set; }

当您将从数据库读取的值呈现回视图时,您应该小心。您应该确保始终对它进行 HTML 编码。例如,该<%:功能开箱即用。

因此,这是一种安全的显示方式:

<div>
    <%: Model.Description  %>
</div>

小心要这样做:

<div>
    <%= Model.Description  %>
</div>

因为这不会对输出进行 HTML 编码,并且您的站点容易受到 XSS 的攻击。

这是使用DisplayFor助手的另一种安全方法:

<div>
    <%= Html.DisplayFor(x => x.Description) %>
</div>

此外,如果您想在可编辑字段或文本区域中呈现它,只需使用相应的帮助器:

<div>
    <%= Html.TextAreaFor(x => x.Description) %>
</div>
于 2013-01-11T17:24:28.737 回答