使用挖空将 HTML 字符串传递给 C# 控制器.我做错了什么

本文关键字:控制器 什么 错了 字符串 HTML | 更新日期: 2023-09-27 18:34:53

>好吧。我可以从页面中获取我需要的 HTML(它们都在 DIV 中(。这不是问题所在。我需要做的是获取 HTML 并通过 C# 类将其传递到控制器中。

我尝试用 knockout/jQuery 做这样的事情:

    var Details = $("#Details").html();
    console.log(Details);
    DetailsPdf.DetailsMarkup = JSON.stringify(Details);
    var jsonData = ko.toJS(Details);
    ko.utils.postJson("/MyController/MyAction", DetailsPdf);

淘汰赛实际上确实让我获得了相关的 HTML。但是当我把它传递给我的类时,我得到一个异常,内容如下:

从客户端检测到具有潜在危险的 Request.Form 值。

然后它部分显示我作为异常的一部分发送的 HTML。我什至无法在没有出现异常的情况下传入实体本身。

这是一个具有某些公司强制安全功能的应用程序,因此无法关闭验证。

我需要 HTML,或者至少是一种在 C# 的服务器上重新创建它的方法。

我对淘汰赛还是比较陌生的。有人在这里有什么建议吗?

使用挖空将 HTML 字符串传递给 C# 控制器.我做错了什么

你应该提到:

这是一个具有某些公司规定的安全功能的应用程序,因此 关闭验证不是一种选择。

在您最近的问题中使用iTextSharp与淘汰JavaScript框架中?我本可以在那里提供这个答案。

我不确定为什么用[ValidateInput(false)]装饰控制器 Action 不起作用,但该答案的完全有效的源代码是可用的。无论出于何种原因,您只需要进行一些更改即可解决此问题:

(1( Base64 在 JavaScript 中对 HTML 进行编码:

ko.utils.postJson("/MyController/MyAction", window.btoa(DetailsPdf));

(2( 解码 MVC 控制器中的字符串:

[HttpPost]
public ActionResult Index(string xHtml)
{
    xHtml = Encoding.UTF8.GetString(Convert.FromBase64String(xHtml));

(3( 使用 Json.Net 或其他将该字符串反序列化为模型/实体。

上述步骤也已经过测试和验证,工作正常。 ;)

您应该

能够在具有 HTML 的属性上使用 [AllowHtml] 属性修饰模型(控制器操作所期望的模型(。

执行此操作时,MVC 将跳过该属性的验证。

下面是指向文档的链接,以获取更多信息。

注意 仅在需要时使用此选项。如果误用,它确实会打开 XSS 的向量。


编辑:如果由于某种原因,您无法使用 [AllowHtml] 属性,则可以关闭使用 [ValidateInput(false)] 验证该操作的请求。

同样的规则适用。非常谨慎地使用它。这意味着不会仅在该特定操作中针对该特定模型运行任何安全验证。