我有以下情况 - 而我真正想要的是来自真人的真正帮助。建议/解决方案?请。
我有一个外联网网站。 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”,他就可以向服务器发出请求,服务器将自动响应请求。
我有什么选择?我该如何验证请求?如何防止这类未经授权的请求?
答案 0 :(得分:4)
Web请求本质上是公开的。他们甚至不需要查看源文件。他们可以简单地监视HTTP请求并重放这些请求(例如,使用像fiddler这样的工具非常容易。)
限制解决方案确实不可行,尽管它们会降低攻击率。问题是攻击者可以编写一个运行一天的脚本。然后,他可以使用代理发送并行请求。如果您按用户名限制,他们可以通过尝试在合法用户名上进行虚假登录来实现DoS,当实际用户尝试登录时,他将无法知道他被锁定的原因。
典型的方法是使用随机数键。这将需要一些额外的工作,但它将缓解问题,只有你真的预料到攻击或其他东西的冲击才会建议。客户端将nonce密钥作为URI查询参数传递给它的简化版本。密钥由服务器首先发布给客户端。请求完成后,服务器验证数据库中是否存在nonce密钥并允许请求。它会立即删除nonce密钥,因此用户无法使用相同的nonce密钥发出另一个请求,但服务器需要向用户发出更多nonce密钥。
简化的解决方案是仅允许经过身份验证的用户发出Web服务请求,但由于您正在设计登录系统,这显然不会坚持。
除非你有一些讨厌的对手,否则我不担心。
答案 1 :(得分:1)
我假设你已经暴露了你的Page方法加载会话,所以我猜你可以在页面加载时设置一个会话变量,然后在调用页面方法时检查它是否存在。它不是世界上最安全的东西,但它会有所帮助。
就个人而言,我并不打算让它变得更安全 - 正如其他人所说的那样,网络服务本质上是公开的。
答案 2 :(得分:0)
我说没有问题;但是,你可能想做一些Rate Limiting,所以人们不能尝试强制它。
答案 3 :(得分:0)
你也可以在2-3次登录失败后放置验证码,这样可以避免蛮力。