ASP .NET控制器的“安全性”如何

时间:2014-07-15 18:33:55

标签: javascript ajax asp.net-mvc security webdeploy

我对ASP .NET的MVC和AJAX的概念和设计还很陌生,我想知道在web部署时Controller对于不受欢迎的用户有多安全。

我问,因为有趣的是我制作了一个需要用户名和密码的小管理面板。输入输入后,信息是AJAX提交给Controller中的ActionResult方法,该方法只比较字符串以查看它们是否匹配,然后将响应返回给AJAX。

我的问题是,有人进入我的控制器并查看硬编码密码有多容易?

没有专业类型的人会试图闯入这个,因为它是一个大学俱乐部的免费网站,但我想确保普通的计算机科学学生不能只是打破#34;打破在"如果他们碰巧"愤怒"或者对某事感到生气(你永远都不知道!哈哈)。

问题:在控制器内进行密码验证"正确地#34;在ASP .NET MVC Web部署的应用程序上安全吗?为什么或为什么不呢?

以下是实际代码,如果使用它对答案很重要(域名因隐私而被省略)

注意:我理解这种Javascript的使用可能不好,但我正在寻找一个相对于AJAX和Controller安全性密码检查的答案。

查看(管理员/)

//runs preloadFunc immediately
window.onpaint = preloadFunc();

function preloadFunc() {
    var prompting = prompt("Please enter the password", "****");
    if (prompting != null) {
        $.ajax({
            url: "/Admin/magicCheck",
            type: "POST",
            data: "magic=" + prompting,
            success: function (resp) {
                if (resp.Success) {
                  //continue loading page
                }
                else {
                    //wrong password, re-ask
                    preloadFunc();
                }
            },
            error: function () {
                  //re-ask
                  preloadFunc();
            }
        });
    }
    else {
       // Hitting cancel
        window.stop();
        window.location.replace("google.com");
    }
}

控制器(ActionResult Snippet)

[HttpPost]
public ActionResult magicCheck(string magic)
    {
        bool success = false;
        if (magic == "pass")
        {
            success = true;
        }
        else
        {
            success = false;
        }
        return Json(new { Success = success });
    }

我再次对MVC和AJAX不熟悉,更不用说处理安全问题了,所以我只想知道Controller的安全性,特别是webdeploy这个简单的密码设置。

4 个答案:

答案 0 :(得分:2)

在正常操作期间,没有任何问题,因为您的代码已编译,DLL无法提供服务,并且浏览器无法请求控制器泄露其自己的代码。

然而,服务器的无法预料的错误,漏洞或错误配置可能导致服务器泄露已编译的代码,web.config等,从而有人可以反汇编代码(IL是容易反编译)并透露你的秘密。

更令人担忧的是,有人可以直接抓取二进制文件并进行反汇编以找到你的秘密。

另一件需要考虑的事情是,在正常情况下,谁可能会看到这个秘密以及他们是否应该知道它。可以允许开发人员,测试人员或审阅者编写或检查代码,但您可能不希望他们知道该秘密。

处理此问题的一种方法不是以纯文本形式存储机密。相反,create a hash的有效值,然后更新您的应用程序以相同的方式散列用户的输入,并比较结果。这样,如果用户获取源代码,他们就无法读取原始纯文本值,甚至无法将其复制/粘贴到用户界面中。您可以滚动自己的代码进行散列,使用FormsAuthentication API或其他内容。

最后,不要依赖客户端执行安全性。您可以检查客户端的安全性以使UI做出适当的反应,但所有服务器端请求都应该进行检查以确保用户的安全声明有效。

关于如何管理身份,密码和进行安全断言,问题确实超出了范围。花一点时间查看有关该主题的myriad articles。此外,Visual Studio ASP.NET项目模板包含许多已经存档的安全基础结构,可以帮助您提供先机。

永远不要把事情弄得一塌糊涂是一项重要的政策。了解ASP.NET和MVC的各种身份验证和授权工具是值得的。此外,还有很多APIs你可以插入来为你做很多繁重的工作。

答案 1 :(得分:2)

正如已经指出的那样,如果您可以获得应用程序的二进制文件(或者任何.NET应用程序而不仅仅是MVC),那么它肯定会游戏结束。

刚刚坐在我面前,现在我有3个应用程序让孩子玩儿看看里面有什么。

  • Telerick - Just decompile
  • IL-间谍

两者都可以在几秒钟内免费下载,前两者将采用整个编译程序集,实际上不仅仅是对代码进行反向工程,而且还会创建一个解决方案文件和其他项目资产,允许我加载它立即回到Visual Studio。

同时,Visual Studio允许我在另一个项目中引用二进制文件,然后让我浏览它们,只使用简单的对象浏览器来查找它们的调用结构。

您可以对程序集进行模糊处理,并且有很多应用程序可以执行此操作,但它们仍然不会阻止您对代码进行反编译,而只是使反向工程代码难以阅读。

另一方面

即使您没有使用上述任何内容,您仍然可以使用命令行工具,例如" Strings"或编辑,如" Ultra Edit 32"和" Notepad ++"可以显示十六进制字节和可读ASCII,以可视方式选择有趣的文本字符串(这种方法也适用于本机编译的代码)

如果您只是担心偶然驾驶/意外入侵,那么您要做的第一件事就是确保您不要将源代码保存在服务器文件夹中。

令人惊讶的是,有多少生产MVC网站,以及开发人员实际上在服务器上提供活动项目文件和开发配置的地方。

值得庆幸的是,在大多数情况下,IIS7设置了合理的默认值,这意味着像' *。CS'文件,或者' web.config'尝试下载文件时会拒绝这些文件。

它绝不是一门精确的科学,只需尝试以下链接就可以了解我的意思!!

filetype:config inurl:web.config inurl:ftp

(别担心它安全,它只是一个常规的Google搜索链接)

因此,为了避免这种泄漏文档的情况,需遵循以下几条规则:

  • 使用网络发布向导,确保只运行所需的文件最终在服务器上
  • 不要将您的基于实时网络的FTP根目录指向项目根目录,事实上如果您根本不能使用FTP
  • 请仔细检查所有内容,如果可能,请让几个值得信赖的朋友尝试下载他们不应该做的事情,即使有了先机,他们也应该努力

从服务器配置开始,您有很多安全选择。

我绝对不会提倡做的一件事就是自己动手。

多年以来,.NET已经有许多非常好的基于安全性的系统,这些系统已经融入了它的核心,其主要部分是“ASP.NET会员资格”和#34;而目前的新人是" ASP.NET简单会员"

每个产品都有自己的优点和缺点,但每个产品都有一些你使用的方法没有的东西 全球保护

正如您现有的代码所示,它只是该控制器上的一个简单密码。

但是,如果我没有给它密码怎么办。

如果我改为尝试尝试一些随机的网址并碰巧幸运,会发生什么。

例如:http://example.com/admin/banned/

哦,看,我已经禁止了用户页面了。

这是完全不熟练的脚本小子和网络破坏者寻找的低挂入点的类型。他们在一个站点到另一个站点四处闲逛,尝试随机和伪随机URL这样的,并且经常他们确实很幸运,找到一个不受保护的页面,允许他们进入足够远的地方,运行自动脚本到做其余的事。

可怕的部分是,像你这样的小型大学俱乐部网站也是他们所寻找的东西,他们中的很多人为吹牛的权利做了这种事情,然后他们在朋友面前游行甚至更少比他们自己更有技巧,然后将他们视为" Hacking Heroes"因为他们闯入了学院网站"

但是,如果您使用的是ASP.NET会员资格,那么您不仅要使用经过试用和测试的安全性,还要将此保护放在的每个页面上。站点,无需将锅炉板代码添加到您编写的每个控制器中。

相反,您使用简单的数据注释来表示"此控制器是不受保护的"和#34;这个用户没有管理员状态"让ASP.NET应用网站范围内的安全性,即“#34; NO"你不能为其他所有事情设定规则。

最后,如果你想要ASP.NET安全,MVC或其他方面的最后一个词,那么去访问 Troyhunt.com 我保证,如果你不是'事先害怕,你会在事后。

答案 2 :(得分:0)

看起来您正在通过AJAX POST发送密码。对于您的问题,我的答案是您应该考虑使用SSL或在通过POST发送密码之前加密密码。请参阅此答案以获取示例和说明SSL Alternative - encrypt password with JavaScript submit to PHP to decrypt

正如HackedByChinese所说,存储在编译文件(DLL)中的实际代码不会太大。如果你想要更加偏执,你也可以将密码存储在web.config中并在那里加密。以下是How to encrypt username and password in Web.config in C# 2.0

的示例和解释

答案 3 :(得分:0)

此代码根本不安全。您的JavaScript代码可以替换为用户想要的一切。所以有人可以摆脱你的preloadFunc。平均计算机科学学生将直接从控制台执行此代码:

if (resp.Success) {
    //continue loading page
    //this code can be executed by hand, from console
}

在您的安全方面,这将是全部。

每次请求都应该向服务器发送身份验证和授权信息。作为一个简单的解决方案,您可以通过调用

来使用FormsAuthentication
FormsAuthentication.SetAuthCookie("admin")
仅在密码正确时才在/Admin/magicCheck

然后你应该使用[Authorize]属性修饰数据检索方法,以检查cookie是否存在。

使用SSL来保护浏览器和服务器之间的通信也是明智的,否则密码将以明文形式传播。