ASP.NET MVC应用程序安全

4
今天我测试了我的ASP.NET MVC Web应用程序,发现任何人都可以轻松地在没有访问我的网站的情况下提交我们网站的表单?
例如:example.com/home/test
[HttpPost]
public ActionResult Test(string name)
{
    return View("home");
}  

<form id="myForm" method="post" action="example.com/home/test">
    <input type="text" name="name" />
    <input type="submit" />
</form>

如果其他网站制作了这个表单,当用户填写表单时,我的网站会受到影响。

我能够检查用户通过我的网站或其他网站所做的请求吗?

4个回答

6
听起来你可能需要一些跨站点请求伪造(CSRF)的帮助。ASP.NET MVC有一个非常简单的工具可以帮助解决这个问题:
如果您在被提交的表单中包含:<%= Html.AntiForgeryToken() %>,然后您可以使用[ValidateAntiForgeryToken]属性标记您的操作方法,并且能够相当好地防止CSRF攻击。不要只听我的话,查看Steve Sanderson的[旧]博客文章,它应该具有您所需的所有背景和信息。 http://blog.stevensanderson.com/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

它没有起作用吗?我在本地主机上运行两个应用程序,两个应用程序都生成了相同的伪造密钥。 - Steven Spielberg
1
@steven 它使用机器密钥,在这两种情况下都是相同的。 - bzlm

5

它没有起作用,我正在使用自己的登录系统。当我从许多应用程序进行测试时,它会重定向到 /account/login,并且不停止接受第二个应用程序请求。 - Steven Spielberg
抱歉,我误解了你的问题。DM的答案非常准确。 - Richard Poole

1

0

Steven,

除了上面的建议(我真的不明白为什么它们在计算机科学中有效),此外,您还可以在控制器内检查请求的来源:

var origReq = HttpContext.Request.UrlReferrer;

或者,检查头文件并根据内容确定您的“操作”:

var headers = HttpContext.Request.Headers;

[编辑] - 当然,'headers'可以被篡改(取决于某人是否决定将帖子发布到您的网站),因此您可能只能将其用于信息目的 - 这不是100%的确定性...

然后,您可以根据它是否来自您的域名(或经批准的域名)来决定是否允许此“帖子”。

jim


我因为建议可以进行额外的检查而被砍掉了腿。我会收拾好自己,以后闭嘴...祝大家好运...所有人都发表了一些不错的评论,特别是bzlm。 - jim tollan
DM - 你真是个绅士,希望我听起来不像在乞讨。谢谢,那些“-1”看起来很不好……再次祝一切顺利。 - jim tollan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接