gpt4 book ai didi

security - 从客户端 (&) 检测到潜在危险的 Request.Path 值

转载 作者:行者123 更新时间:2023-12-04 06:09:59 25 4
gpt4 key购买 nike

我明白为什么会发生这种情况,但我需要一个解决方法。我在 StackOverflow 上研究了一些其他问题,但没有一个有帮助。我不想在整个网站上禁用输入验证,因为这绝对是危险的。我只有一个(至少现在)需要禁用输入验证的地方。

我用 [ValidateInput(false)] 属性修饰了 Action 方法,并用 Html.Encode 对字符串进行了编码。但是,我仍然遇到相同的错误。这是我的观点:

<div id="sharwe-categories">
<ul class="menu menu-vertical menu-accordion">
@foreach(var topLevel in Model)
{
var topLevelName = Html.Encode(topLevel.Name);
<li class="topLevel">
<h3>
@Html.ActionLink(topLevel.Name, "Index", "Item", new { category = topLevelName }, new {@class = "main"} )
<a href="#" class="drop-down"></a>
</h3>
<ul>
@foreach (var childCategory in topLevel.Children)
{
var childcategoryName = Html.Encode(childCategory.Name);
<li>@Html.ActionLink(childCategory.Name, "Index", "Item", new RouteValueDictionary { { "category", topLevelName }, { "subcategory", childcategoryName } }, null)</li>
}
</ul>
</li>
}

</ul>

</div>

如您所见,没有用户输入。但是某些类别名称中包含一些“危险”字符...有什么解决方案吗?

最佳答案

尽管 Darin 的回答是完全可行的,但我不建议使用 Scott Hanselman 逐步关闭所有这些验证的技术。你迟早会陷入深深的...

使用 ID 和虚拟字符串(这对 SEO 和人们非常有用)的第二个建议是一种可行的方法,但有时它们也不可行。想象一下这个请求 URL:

/111/Electronics/222/Computers/333/Apple

虽然我们有这些我们可以依赖的 ID 和人类/SEO 友好的类别名称,但这绝对不是我们想要的。当我们需要表示单个项目时,ID + Dummy string 是可行的。在其他情况下不是。而且由于您必须显示类别和子类别,这是一个问题。

所以,你可以做什么?

两种可能的解决方案:
  • 清除类别名称以仅包含有效字符 - 这可以完成,但如果这些不是静态的并且可由特权用户编辑,那么您在这里就不走运了,因为即使您现在已经清除了它们,稍后也会有人输入无效的内容
  • 随时随地清理您的字符串 - 当您使用类别名称时,将其清理,并在读取和使用它(以获取实际类别 ID)时,您可以将提供的(先前清理的)类别名称与您清理的数据库中的值进行比较苍蝇要么:
  • 现在同时过滤类别
  • 在生成类别名称之前

  • 我建议您采用 2.2 方法。扩展您的数据库表以具有两列:
  • 类别显示名称
  • 类别 URL 友好名称

  • 您还可以在第二列上设置唯一约束,因此您的两个类别(即使它们具有不同的显示名称)不会具有相同的 URL 友好名称。

    如何清洁

    想到的第一件事是去除无效字符,但这非常乏味,您很可能会遗漏一些东西。从类别显示名称中获取有效字符要容易得多,也更明智。我在生成虚拟 URL 类别名称时做了同样的事情。只需取出有效的并将其余部分装箱即可。它通常工作得很好。此类正则表达式的两个示例:
  • (\w{2,}) - 仅使用字母、数字和下划线以及至少其中的两个(因此我们省略了一个或单个数字以及不会增加任何含义并不必要地延长我们的 URL
  • 的类似数字和类似内容)
  • ([a-zA-Z0-9]{2,}) - 只有字母和数字(也是 2+)

  • 获取类别显示名称中的所有匹配项,并用空格/破折号将它们连接起来,并与原始显示名称一起保存。不一样的 question of mine正是关于这一点。

    为什么要增加一列? 因为你不能在 SQL Server 中运行正则表达式。如果您使用的是 MySql,您可以使用一列并在 DB 上使用正则表达式。

    关于security - 从客户端 (&) 检测到潜在危险的 Request.Path 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5682160/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com