1

我的表单上有一个文本字段,可以包含 html 代码和带有 < > 字符的代码。我想将其存储在数据库中,但首先我想对其进行编码,以便可以安全地接受它而无需执行 [allowHtml}。

这是我用来发送数据的代码。请注意,我一次只发送一个字段,可能包含或不包含 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或不processData覆盖jQuery.ajax请求(在您的示例中您没有),发送的数据将默认为 urlencoded:

向服务器发送数据时,使用此[设置]内容类型。默认为“application/x-www-form-urlencoded; charset=UTF-8”,在大多数情况下都可以。

这可以通过使用 Firebug 或类似方法来检查提交的请求来确认。

更新:

看起来您正试图规避没有[AllowHTML]. 无论您最初不使用它的原因是什么,您都可以手动对提交的数据进行编码URI,然后在服务器上将其还原。

关于您的后续问题...但是如果数据已编码,那么为什么我必须使用 [AllowHtml]

使用 提交数据时jQuery.ajax,其内容类型application/x-www-form-urlencoded默认设置为。此编码仅适用于传输期间 - 认为您的数据表示是 urlencoded,而不是实际数据。这有什么不同?当您的服务器收到请求时,它会识别内容类型并在进行进一步处理(和验证)之前对其进行解码。基本上,协议级别的数据传输的较低级别处理由您编写的代码之外的框架处理。

如果您在提交之前手动对客户端上的数据进行编码,那将是您的服务器应用程序接收它的方式,而不会检测到任何危险值。请注意,在传输过程中,字符串将出现有效的双重编码,但这不会影响最终结果。

于 2012-08-05T05:18:50.997 回答
1

使用带有 的视图模型[AllowHtml],然后在存储到数据库之前根据需要进行编码。但是为什么要打扰呢?按原样存储在数据库中,当需要在网页上输出存储在数据库中的值时,只需对其进行 HTML 编码。这就是@Razor 运算符默认执行的操作。

于 2012-08-05T05:31:36.297 回答