ASP.net 请求验证和 Razor — 我真的需要它吗?
ASP.net request validation & Razor — do I really need it?
我想知道我是否真的需要 ASP.net 请求验证(抛出“A potentially dangerous Request.Form value was detected from the client
”的那个)?
我使用 Razor 模板引擎并且仅使用以下命令从我的数据库中输出一些内容:
DisplayFor
/EditorFor
(转义 HTML)
@Model.SomeField
(转义 HTML)
- 需要 HTML 标记的特定字段专门转换为具有 HTML 白名单清理的
HtmlString
实例。
似乎我不需要 任何 请求验证,并且可以在用户输入 HTML 时完全禁用它而不会出现异常,不是吗?或者我遗漏了什么?
那么关闭它的首选方法是什么?
您可以通过添加 [AllowHtml] 属性在特定属性上禁用它。
但如果您故意不允许 HTML,那么您应该验证它,因为有人不仅可以添加标记,还可以添加脚本,例如 alert('tard')
然后每次有人加载您的页面时,都会受到侮辱:(
可以禁用RequestValidation。这实际上是一种提高安全性的愚蠢方法,但这是微软试图让他们的东西变得防白痴(在我看来)。 "Idiot-proof" 有点苛刻 - 做好安全工作很难,我并不是说这是一件坏事,但如果这是你抵御 XSS 的唯一防线,那么你可能有麻烦了。
话虽这么说,听起来您需要在请求中包含特殊字符 - 因此您应该禁用它并确保 escape/encode 您的输出正确。
这里有一个很好的禁用它的资源:Request Validation in ASP.NET
相关位:
web.config(全局禁用)
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
方法(仅针对您发送 html 的方法)
[ValidateInput(false)]
public ActionResult Edit(string comment)
属性(只有 属性 包含 html)
[AllowHtml]
public string Prop1 { get; set; }
在我看来,您应该在全局范围内启用它,但尽可能小地禁用它。最好在安全方面犯错,拥有额外的安全层通常是一件好事,除非它会使系统过于复杂。
因此,总而言之,如果您有意允许此类请求,则无需进行请求验证,但要小心处理数据并确保您不会为 XSS 敞开心扉。
我想知道我是否真的需要 ASP.net 请求验证(抛出“A potentially dangerous Request.Form value was detected from the client
”的那个)?
我使用 Razor 模板引擎并且仅使用以下命令从我的数据库中输出一些内容:
DisplayFor
/EditorFor
(转义 HTML)@Model.SomeField
(转义 HTML)- 需要 HTML 标记的特定字段专门转换为具有 HTML 白名单清理的
HtmlString
实例。
似乎我不需要 任何 请求验证,并且可以在用户输入 HTML 时完全禁用它而不会出现异常,不是吗?或者我遗漏了什么?
那么关闭它的首选方法是什么?
您可以通过添加 [AllowHtml] 属性在特定属性上禁用它。
但如果您故意不允许 HTML,那么您应该验证它,因为有人不仅可以添加标记,还可以添加脚本,例如 alert('tard')
然后每次有人加载您的页面时,都会受到侮辱:(
可以禁用RequestValidation。这实际上是一种提高安全性的愚蠢方法,但这是微软试图让他们的东西变得防白痴(在我看来)。 "Idiot-proof" 有点苛刻 - 做好安全工作很难,我并不是说这是一件坏事,但如果这是你抵御 XSS 的唯一防线,那么你可能有麻烦了。
话虽这么说,听起来您需要在请求中包含特殊字符 - 因此您应该禁用它并确保 escape/encode 您的输出正确。
这里有一个很好的禁用它的资源:Request Validation in ASP.NET
相关位:
web.config(全局禁用)
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
方法(仅针对您发送 html 的方法)
[ValidateInput(false)]
public ActionResult Edit(string comment)
属性(只有 属性 包含 html)
[AllowHtml]
public string Prop1 { get; set; }
在我看来,您应该在全局范围内启用它,但尽可能小地禁用它。最好在安全方面犯错,拥有额外的安全层通常是一件好事,除非它会使系统过于复杂。
因此,总而言之,如果您有意允许此类请求,则无需进行请求验证,但要小心处理数据并确保您不会为 XSS 敞开心扉。