我想知道在asp.net mvc环境中使用带有action属性的表单可能存在的风险吗?
例如;创建视图具有< form action =" / Person / Create" ...>在html标记上。
有人可以用fiddler发送帖子到mydomain.com/Person/Create(例如)吗?
它在Jquery ajax脚本中也非常相似。在html标记上可以看到post或get方法的名称。 Everbody可以看到我页面的html源代码。这意味着有人可以看到我的行为'名。
我如何才能对这个问题采取安全的方法?
当然我可以在httppost动作上拥有Bind属性。但我的愿望是做出我的行动'名字秘密或有最佳实践的想法。 (如果可能的话)
谢谢你的一切。
答案 0 :(得分:4)
您无法隐藏自己的行为,但是您可以使用ASP.NET内置的Anti Forgery Tokens来完成这方面的基本安全策略。 https://msdn.microsoft.com/en-us/library/dd470175(v=vs.118).aspx
在表单中,使用内置的HTML Helper放置一个标记:
selectedStore
然后在您的操作中,放置相应的属性:
@Html.AntiForgeryToken()
现在,您无法针对控制器操作模拟POST请求。
...正如Sedat正确指出的那样:绝对而且很明显,是的,如果您不希望他们匿名执行,您的行为应始终通过您的操作,控制器或其他更深层机制的授权属性来保护一般公众。
答案 1 :(得分:1)
Theres无需隐藏该信息,您希望客户端知道将数据发送到何处。他们如何做到这一点并不取决于您,通过浏览器,Fiddler或其他客户端程序。更重要的是,由GET或POST产生的Actions是安全的。绑定属性,例如保护你免受重叠。
Emilio's解决方案会模糊您的操作名称,这对于提高网址的可读性很有帮助,但不会使其更安全,因为现在攻击者会看到公开名称,无论如何它们都将被路由到您的操作。
答案 2 :(得分:1)
如果你指的是这个,我现在不知道。 但是,如果您不希望客户端用户知道您的操作名称,您可以使用ActionName属性更改操作:
public class ProductsController {
[ActionName("PublicName")]
public ActionResult SecretName() {
return View();
}
}
从客户端导航的网址为http://yoursite/Products/PublicName而不是http://yoursite/Product/SecretName
您无法完全隐藏自己的动作。因为你有小提琴手,你可以看到从客户端到服务器的任何请求,这样你就可以通过这种方式知道动作的名称。
答案 3 :(得分:1)
不要隐瞒你的行为。
通过执行授权来避免未经授权的访问。
通过使用反请求伪造令牌(如@ Moby的Stunt Double的答案),防止操纵授权人员不情愿地执行操作(也称为XSRF攻击)。