弱智的MVC。

寒飞a 2013-08-22 10:47:34
标题先吸引下,其实我是初学asp.net MVC,最近想设计个系统,用MVC框架。发现很多MVC的问题都不利于我的设计,有些设计另我非常的难过,当然也有可能是我没找到方法(本人学不久)
我用的MVC4.0

第一个:Post提交验证值的问题,如果有文本编辑器会报一个错误

从客户端(Domain_Memo="<p>432</p>
")中检测到有潜在危险的 Request.Form 值。
说明: 请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止。该值可能指示存在危及应用程序安全的尝试,如跨站点脚本攻击。若要允许页面重写应用程序请求验证设置,请将 httpRuntime 配置节中的 requestValidationMode 特性设置为 requestValidationMode="2.0"。示例: <httpRuntime requestValidationMode="2.0" />。设置此值后,可通过在 Page 指令或 <pages> 配置节中设置 validateRequest="false" 禁用请求验证。但是,在这种情况下,强烈建议应用程序显式检查所有输入。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkId=153133。


百度一下这个问题,答案一大堆,方法就是字server.web节点加上 <httpRuntime requestValidationMode="2.0" />,并且给pages节点配置上validateRequest="false"的属性,其实错误里也说明了,但是我这样配置后,无论如何也没作用,继续百度,看到一条在action上加 [ValidateInput(false)],尼玛。还真管用,一下子就好了。

由此问题产生了,我觉得这个设计是不是太那个啥了,先置之死地而后生,
假设我的项目里有1W个Action 10W个action 几十万个action,是不是我得写几十万次,然后如果需要需要改变的话我又得重复的去改呢? 为什么不像2.0一样做成可以通过web.config开启或者关闭的呢?这样做有什么好处?我因为全部action都不需要这样的验证,故所以感到无比烦躁,望大神指点1 2.

第二个问题其实和第一个是一样的,就是做form验证时默认的配置也是不起作用了,全部都默认不转向到指定的登录界面了,也是需要在每个action上去加个类似的属性。

我只想问问,难道可以配置开关有什么不好的吗?这样的设计另我想放弃它继续用asp.net了。
求!!!!!!!!指点迷津
...全文
732 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
所长别开枪 2015-08-21
  • 打赏
  • 举报
回复
光看了点皮毛就上来抱怨mvc烂,你不知道啥叫全局Filter吗?
小樱桃的世界 2013-08-23
  • 打赏
  • 举报
回复
不太懂........................
卧_槽 2013-08-23
  • 打赏
  • 举报
回复
为什么你要在页面上提交有html标签的内容呢?而且还是到处都要提交这种东西。
ktei2008 2013-08-23
  • 打赏
  • 举报
回复
引用 17 楼 luoyehanfei 的回复:
[quote=引用 5 楼 tsgx_1989 的回复:] 最好的方法是只对一个Action禁用验证,只需在该方法上加上特性 [ValidateInput(false)] ,就可以了。
我的意思是验证登录,以前在asp.net from程序里直接配置
01.<authentication mode="Forms">   
02.    <forms loginUrl="~/Account/Login" defaultUrl="~/Home/Index" protection="All"/>   
03.</authentication>   
04.<authorization>   
05.    <deny users="?"/>   
06.    <allow users="*"/>   
07.</authorization>  
而在MVC这样是不能实现了,需要在需要验证的页面控制器上加一个属性如:
01.[Authorize]   
02.public ActionResult Index()   
03.{   
04.    return View();   
05.}   
这样如果我每个action都需要做身份验证,只有login这个action不做身份验证,又得和上面的一样,在每个action上去加相同的代码。[/quote] 你可以把[Authorize]放到Controller上:

[Authorize]
class SecureController
之后把Login提出来,放到PublicController下(PublicController就不要继承SecureController了)。 最后把你当前的Controller继承SecureController。
showtime5156 2013-08-23
  • 打赏
  • 举报
回复
用了asp.net web from 开发两年了,重新投向mvc的怀抱,表示mvc是个理解它的人认为他是个好东西,不理解它的人认为它是垃圾。
对于楼主的第一个问题,有几点要说的
1.楼主习惯了一种开发模式,初次使用其他的模式,由于自己的不熟悉就批判他,这不是个做法哦,当年你为了解决asp.net webform 出现这种问题的时候可以耐心找答案,为什么对mvc就不行呢?君不看#1楼的大牛就给了你一个很好的方案吗(我也没验证过正确与否,因为我是不希望这样做)?
2.不去思考为什么框架的设计者设计的原因,就盲目的批判。个人觉得asp.net(不分webform和mvc)设计表单默认不能提交危险字符,意思很明显,也很合理,一个站点本就不可能有非常多的地方需要提交这种数据,如果有的话,我很想问是不是有这个网站有问题啊?如果真的有这样的站点,而这个mvc不能满足你的需求的话,那是应该你不去选择用他,而不是批判“弱智的mvc”。每种技术都有其优缺点,适用范围,请合理的使用正确的技术,而不是在一个技术不满足你的需求情况下去批判他,是你选择了它来做它不能做的事,这不是mvc的错。
语言似乎有点锐利,但我没什么恶意,我的意思有两个
1.为喜欢mvc模式的人说句话,同时让准备拥抱mvc的人不至于看到这篇帖子而有对mvc有些不合理的负面影响
2.也是希望对楼主有点帮助,能让楼主醒悟自身的一些思维暗点,改正过来。
最后弱弱的说句,本人也是菜鸟,讲的有任何不妥的地方,欢迎提出。你对我的批判就是帮助我成长
rztx2013 2013-08-23
  • 打赏
  • 举报
回复
对的,webform也有这样的问题
ltcszk 2013-08-23
  • 打赏
  • 举报
回复
都没人告诉lz就算是webform也是有这个危险字符的问题吗?
寒飞a 2013-08-23
  • 打赏
  • 举报
回复
引用 5 楼 tsgx_1989 的回复:
最好的方法是只对一个Action禁用验证,只需在该方法上加上特性 [ValidateInput(false)] ,就可以了。
我的意思是验证登录,以前在asp.net from程序里直接配置
01.<authentication mode="Forms">   
02.    <forms loginUrl="~/Account/Login" defaultUrl="~/Home/Index" protection="All"/>   
03.</authentication>   
04.<authorization>   
05.    <deny users="?"/>   
06.    <allow users="*"/>   
07.</authorization>  
而在MVC这样是不能实现了,需要在需要验证的页面控制器上加一个属性如:
01.[Authorize]   
02.public ActionResult Index()   
03.{   
04.    return View();   
05.}   
这样如果我每个action都需要做身份验证,只有login这个action不做身份验证,又得和上面的一样,在每个action上去加相同的代码。
Ahoo 2013-08-23
  • 打赏
  • 举报
回复
引用 15 楼 luoyehanfei 的回复:
[quote=引用 14 楼 tsgx_1989 的回复:] [quote=引用 12 楼 luoyehanfei 的回复:] [quote=引用 9 楼 tsgx_1989 的回复:] [quote=引用 7 楼 luoyehanfei 的回复:] [quote=引用 5 楼 tsgx_1989 的回复:] 最好的方法是只对一个Action禁用验证,只需在该方法上加上特性 [ValidateInput(false)] ,就可以了。
问题我就是整个项目所有的action现在都不需要。我就得把所有的action去写上这么个玩意,要是等到哪天我又需要了,我又得把所有的去掉,我目地和疑问就是为什么4.0搞成了通过配置不能实现。[/quote] 你每个POST请求都会有HTML标签传送? 这么设计原因就是因为有可能会导致有XSS攻击。[/quote] 或许会有,因为我不确定,我何不用自己的验证的,我自己有xml验证框架的。[/quote] 那我就只能 顶 1楼了。。。[/quote] 关于form验证也是个同样的问题,有没什么好点的解决办法呢、?[/quote] 你所说的Form验证是 验证登陆吧? 有什么问题吗?用户输入的用户名,密码难道会包括Html标签吗?
寒飞a 2013-08-23
  • 打赏
  • 举报
回复
引用 14 楼 tsgx_1989 的回复:
[quote=引用 12 楼 luoyehanfei 的回复:] [quote=引用 9 楼 tsgx_1989 的回复:] [quote=引用 7 楼 luoyehanfei 的回复:] [quote=引用 5 楼 tsgx_1989 的回复:] 最好的方法是只对一个Action禁用验证,只需在该方法上加上特性 [ValidateInput(false)] ,就可以了。
问题我就是整个项目所有的action现在都不需要。我就得把所有的action去写上这么个玩意,要是等到哪天我又需要了,我又得把所有的去掉,我目地和疑问就是为什么4.0搞成了通过配置不能实现。[/quote] 你每个POST请求都会有HTML标签传送? 这么设计原因就是因为有可能会导致有XSS攻击。[/quote] 或许会有,因为我不确定,我何不用自己的验证的,我自己有xml验证框架的。[/quote] 那我就只能 顶 1楼了。。。[/quote] 关于form验证也是个同样的问题,有没什么好点的解决办法呢、?
Ahoo 2013-08-23
  • 打赏
  • 举报
回复
引用 12 楼 luoyehanfei 的回复:
[quote=引用 9 楼 tsgx_1989 的回复:] [quote=引用 7 楼 luoyehanfei 的回复:] [quote=引用 5 楼 tsgx_1989 的回复:] 最好的方法是只对一个Action禁用验证,只需在该方法上加上特性 [ValidateInput(false)] ,就可以了。
问题我就是整个项目所有的action现在都不需要。我就得把所有的action去写上这么个玩意,要是等到哪天我又需要了,我又得把所有的去掉,我目地和疑问就是为什么4.0搞成了通过配置不能实现。[/quote] 你每个POST请求都会有HTML标签传送? 这么设计原因就是因为有可能会导致有XSS攻击。[/quote] 或许会有,因为我不确定,我何不用自己的验证的,我自己有xml验证框架的。[/quote] 那我就只能 顶 1楼了。。。
寒飞a 2013-08-23
  • 打赏
  • 举报
回复
引用 9 楼 tsgx_1989 的回复:
[quote=引用 7 楼 luoyehanfei 的回复:] [quote=引用 5 楼 tsgx_1989 的回复:] 最好的方法是只对一个Action禁用验证,只需在该方法上加上特性 [ValidateInput(false)] ,就可以了。
问题我就是整个项目所有的action现在都不需要。我就得把所有的action去写上这么个玩意,要是等到哪天我又需要了,我又得把所有的去掉,我目地和疑问就是为什么4.0搞成了通过配置不能实现。[/quote] 你每个POST请求都会有HTML标签传送? 这么设计原因就是因为有可能会导致有XSS攻击。[/quote] 或许会有,因为我不确定,我何不用自己的验证的,我自己有xml验证框架的。
moonwrite 2013-08-23
  • 打赏
  • 举报
回复
目的:保护你的数据不受注入 搜搜sql注入 js注入 Iframe注入~等~
寒飞a 2013-08-23
  • 打赏
  • 举报
回复
现在第二个问题就是form验证了。验证时也是需要在每个需要验证的action上加一个标签[AllowAnonymous] 这样和第一个问题是一样的,非常弱智低能,为什么不可以像web.form一样,默认全部验证,然后单独开放一个呢,有没这样的办法。 我很是不情愿在通用的功能上确每个方法都去写相同的代码。 比如web.config默认全部都需要验证,直接在home/login的控制器上加个 [AllowAnonymous(false)]之类的,这样不更好吗。 全部都去写[AllowAnonymous]的机制也不知道是谁想的。
Ahoo 2013-08-23
  • 打赏
  • 举报
回复
引用 7 楼 luoyehanfei 的回复:
[quote=引用 5 楼 tsgx_1989 的回复:] 最好的方法是只对一个Action禁用验证,只需在该方法上加上特性 [ValidateInput(false)] ,就可以了。
问题我就是整个项目所有的action现在都不需要。我就得把所有的action去写上这么个玩意,要是等到哪天我又需要了,我又得把所有的去掉,我目地和疑问就是为什么4.0搞成了通过配置不能实现。[/quote] 你每个POST请求都会有HTML标签传送? 这么设计原因就是因为有可能会导致有XSS攻击。
寒飞a 2013-08-23
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
in Global.asax.cs public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new ValidateInputAttribute(false)); }
楼主的方法确实可行,无需改web.config,可以达到一句话控制全局的目地。
寒飞a 2013-08-23
  • 打赏
  • 举报
回复
引用 5 楼 tsgx_1989 的回复:
最好的方法是只对一个Action禁用验证,只需在该方法上加上特性 [ValidateInput(false)] ,就可以了。
问题我就是整个项目所有的action现在都不需要。我就得把所有的action去写上这么个玩意,要是等到哪天我又需要了,我又得把所有的去掉,我目地和疑问就是为什么4.0搞成了通过配置不能实现。
寒飞a 2013-08-23
  • 打赏
  • 举报
回复
引用 4 楼 a876880345 的回复:
在Asp.net中也有这种错误,是你的文本框中包含了html嵌入代码。可在web.config中配置,将验证的框架版本变为2.0即可。 也可对验证进行关闭: <configuration> <system.web> <pages validateRequest="false" /> </system.web> </configuration>
没用的,必须要在action加属性 [ValidateInput(false)] ,我也是想直接通过web.config达成目地。
Ahoo 2013-08-23
  • 打赏
  • 举报
回复
最好的方法是只对一个Action禁用验证,只需在该方法上加上特性 [ValidateInput(false)] ,就可以了。
Martin-Liu 2013-08-23
  • 打赏
  • 举报
回复
在Asp.net中也有这种错误,是你的文本框中包含了html嵌入代码。可在web.config中配置,将验证的框架版本变为2.0即可。 也可对验证进行关闭: <configuration> <system.web> <pages validateRequest="false" /> </system.web> </configuration>
加载更多回复(10)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧