4

我有以下场景——我真正期待的是来自真实人的真正帮助。建议/解决方案?请。

我有一个 ex 的外联网网站。www.foo.com (asp.net 3.5) 我正在使用 JQuery 1.3.2 在 default.aspx 页面 (www.foo.com/default.aspx) 中调用 ValidateLogin PageMethods

代码将如下所示

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    url: "Default.aspx/ValidateLogin",
    data: '{' + arg + '}',
    success: function (data) {
        if (data.d != 0) {
            window.location = "http://www.google.com";
        } else {
            alert("Invalid UserName/Password.");
            ResetLoginForm();
        }
    },
    error: function (xhr, status, error) {
        var strerror = xhr.status + error;
        alert("Error Communicating with Server:" + strerror);
        ResetLoginForm();
    }
});

代码存储在外部 js 文件中。对于前 default.js。

由于这个网站是公开的,任何人都可以下载 default.js,从而可以查看上面给出的代码。

我的问题是一旦这个人得到这个网址:“Default.aspx/ValidateLogin”,他可以向服务器发出请求,服务器将自豪地响应请求。

我在这里有什么选择?我如何验证请求?如何防止此类未经授权的请求?

4

4 回答 4

4

Web 请求本质上是公开的。他们甚至不需要查看源文件。他们可以简单地监视 HTTP 请求并重播这些请求(例如,使用 fiddler 之类的工具非常容易)。

节流问题

节流解决方案确实不可行,尽管它们会降低攻击率。问题是对手可以编写一个运行几天的脚本。再说一次,他可以使用代理来发送并行请求。如果你限制每个用户名,对手可以通过尝试对合法用户名进行虚假登录来实现 DoS,而当实际用户尝试登录时,他将不知道他为什么被锁定。

解决方案

典型的方法是使用 nonce 键。这将需要一些额外的工作,但它会缓解问题,并且仅在您确实预计会发生攻击或其他情况时才建议使用它。一个简化的版本是客户端将 nonce 键作为 URI 查询参数传递。密钥首先由服务器颁发给客户端。发出请求后,服务器会验证数据库中是否存在 nonce 键并允许请求。它会立即删除 nonce 密钥,因此用户无法使用相同的 nonce 密钥发出另一个请求,但是服务器将需要向用户发出更多的 nonce 密钥。

简化的解决方案是只允许经过身份验证的用户发出 Web 服务请求,但由于您正在设计一个登录系统,这显然不成立。

除非你有一些讨厌的对手,否则我不会担心。

于 2009-05-01T20:19:36.203 回答
1

我假设您已经公开了 Page 方法加载了会话,所以我想您可以在页面加载时设置一个会话变量,然后在调用页面方法时检查它是否存在。这不是世界上最安全的事情,但它会有所帮助。

就我个人而言,我不会费心让它变得更安全——正如其他人所说,Web 服务本质上是公共的。

于 2009-05-01T23:48:34.750 回答
0

我会说没有问题;但是,您可能想要做一些速率限制,这样人们就不能尝试暴力破解它。

于 2009-05-01T19:54:22.410 回答
0

您还可以在说 2-3 次登录失败后放置验证码,以避免暴力破解。

于 2009-05-01T19:57:11.497 回答