我有以下情景–而我真正想要的是来自真实的人的真正帮助。建议/解决方案?请。

我有一个外联网网站。 www.foo.com(asp.net 3.5) 我在default.aspx页面(www.foo.com/default.aspx)中使用JQuery 1.3.2调用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文件中。对于ex default.js。

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

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

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

有帮助吗?

解决方案

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

限制问题

限制解决方案确实不可行,尽管它们会降低攻击率。问题是攻击者可以编写一个运行一天的脚本。然后,他可以使用代理发送并行请求。如果你按用户名限制他们,攻击者可以通过尝试合法用户名的虚假登录来实现DoS,当实际用户尝试登录时,他将不知道他被锁定的原因。

解决方案

典型的方法是使用随机数键。这将需要一些额外的工作,但它将缓解问题,只有你真的预料到攻击或其他东西的冲击才会建议。客户端将nonce密钥作为URI查询参数传递给它的简化版本。密钥由服务器首先发布给客户端。请求完成后,服务器验证数据库中是否存在nonce密钥并允许请求。它会立即删除nonce密钥,因此用户无法使用相同的nonce密钥发出另一个请求,但服务器需要向用户发出更多nonce密钥。

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

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

其他提示

我假设你已经暴露了你的Page方法加载会话,所以我猜你可以在页面加载时设置一个会话变量,然后在调用页面方法时检查它是否存在。它不是世界上最安全的东西,但它会有所帮助。

就个人而言,我并不打算让它变得更安全 - 正如其他人所说的那样,网络服务本质上是公开的。

我说没有问题;但是,你可能想做一些速率限制,所以人们不能尝试粗暴地强迫它。

你也可以在2-3次登录失败后放置验证码,这样可以避免蛮力。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top