Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MVC3/C#中的过滤(或清理用户输入)?_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 3_Razor - Fatal编程技术网

MVC3/C#中的过滤(或清理用户输入)?

MVC3/C#中的过滤(或清理用户输入)?,c#,asp.net,asp.net-mvc,asp.net-mvc-3,razor,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Razor,确保用户在表单中输入任何html或javascript(甚至SQL)时,所有内容都被清除并仅显示纯文本(或将以纯文本显示其html)或向用户提供错误的最佳/最安全的方法是什么?显然,我试图阻止XSS和任何类型的注入,我也不希望用户试图用他们自己的HTML干扰我页面的显示。理想情况下,我不希望将HTML写入数据库 编辑:我不确定谁是答案,因为你们都从不同的角度解决了这个问题为什么在存储到数据库之前要过滤?输出时进行过滤。例如,在web应用程序中,可以使用HTML编码。Razor@功能已完成以下操作

确保用户在表单中输入任何html或javascript(甚至SQL)时,所有内容都被清除并仅显示纯文本(或将以纯文本显示其html)或向用户提供错误的最佳/最安全的方法是什么?显然,我试图阻止XSS和任何类型的注入,我也不希望用户试图用他们自己的HTML干扰我页面的显示。理想情况下,我不希望将HTML写入数据库


编辑:我不确定谁是答案,因为你们都从不同的角度解决了这个问题

为什么在存储到数据库之前要过滤?输出时进行过滤。例如,在web应用程序中,可以使用HTML编码。Razor
@
功能已完成以下操作:

@Model.SomePropertyThatCouldContainHTML
现在你安全了。在数据库中,存储的实际字符串可以在其他应用程序中重用。例如,在一个桌面应用程序中,您不需要担心XSS,所以去掉这些标记是没有意义的

但是,如果您需要显示未编码的用户输入,您可以使用该库从中删除所有可能导致XSS的危险javascript代码


就SQL而言,始终使用参数化查询,这样您就不必担心任何SQL注入。

默认情况下,请求验证在您的网站中打开。基本上,这会在每个请求到达服务器时检查它,如果它检测到一个潜在的危险请求,它将抛出一个异常。理论上这很好,但事实是,至少在我的经验中,你几乎总是在使用某种RTE(或用户输入)的页面上关闭这个功能,因为仅仅存在HTML就会导致验证失败

有许多方法可以防止XSS,但以下是一些基本方法:

  • 限制您的输入。这意味着,如果您有一个字段中应该只有数字(例如电话号码),则禁止用户在该字段中键入除数字以外的任何内容
  • 对输入进行解码/编码
  • 简单地找到一个要剥离的正则表达式并不是解决问题的灵丹妙药,因为可以对XSS请求进行编码,从而使请求中不存在任何物理标记
以下是一些资源:

  • 我在几个项目中使用过这个库,它非常健壮
  • 关于如何防止XSS的模式和实践
最后,当有疑问时,调查

  • 在这里:
  • 在这里:
  • 在这里:
  • 在这里:

  • 对不起,伙计,你用谷歌搜索过吗?@Andre,我用谷歌搜索过,但找不到任何具体内容,因为我想在你提到的第一个链接中下载这个库,但是下载链接断了是他们的主页还是另一个获取库的地方?你可以把它从Codeplex中拉下来:我真的不想担心每个视图的编码问题,我认为这会给错误留下更多的空间,从而导致错误attack@dreadlocks1221,不,你不需要担心。正如我所说,框架已经解决了这个问题。例如,在Razor中,默认情况下通过
    @
    功能完成此操作。顺便说一句,不要忘记并非所有用户都是恶意的。可能有一些用户只是想使用例如
    我明白了,我将对此进行更多研究