ASP.NET PageMethods和JQuery AJAX Post–;它到底有多安全?

ASP.NET PageMethods和JQuery AJAX Post–;它到底有多安全?,jquery,ajax,security,asp.net-3.5,pagemethods,Jquery,Ajax,Security,Asp.net 3.5,Pagemethods,我有一个下面的场景——我真正期待的是来自真人的真正帮助。建议/解决方案?求你了 我有一个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",

我有一个下面的场景——我真正期待的是来自真人的真正帮助。建议/解决方案?求你了

我有一个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文件中。对于ex default.js

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

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


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

我认为没有问题;但是,您可能希望执行一些操作,这样人们就不能尝试强制执行。

您也可以在2-3次登录失败后添加验证码,以避免强制执行。

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

节流问题 虽然节流解决方案可以降低攻击率,但实际上并不可行。问题在于,对手可以编写一个持续数天的脚本。然后,他可以再次使用代理发送并行请求。如果你限制每个用户名,对手就可以通过在合法用户名上尝试错误登录来实现拒绝服务,而当实际用户试图登录时,他将不知道自己为什么被锁定

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

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


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

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


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

下面是一个关于codeproject的asp.net验证码控件-