jQuery ajax安全性

jQuery ajax安全性,jquery,Jquery,我有下面的ajax调用,它检查用户是否是付费成员,如果是,它相应地运行某些函数。这是可行的,但我担心安全问题。如果有人在控制台中更改此ajax代码,强制#按钮成功运行函数,而不必执行任何post操作,该怎么办。我可以在仍然使用jQuery ajax的情况下防止这种情况发生吗 $('#button').click(function() { $.ajax({ url:'checkplan', type:'POST', success:funct

我有下面的ajax调用,它检查用户是否是付费成员,如果是,它相应地运行某些函数。这是可行的,但我担心安全问题。如果有人在控制台中更改此ajax代码,强制
#按钮
成功运行函数,而不必执行任何post操作,该怎么办。我可以在仍然使用jQuery ajax的情况下防止这种情况发生吗

$('#button').click(function() {
    $.ajax({
        url:'checkplan',
        type:'POST',
        success:function(data){
            if(data == 'paid')
                //grant access and run some functions
    }
})

最终,您的服务器需要始终实施正确的身份验证。您不能依赖客户机来执行任何操作,因为它总是会受到损害(如果不是在您的网页中,则是在定制的网页中)。因此,当您登录时,您的服务器需要返回某种令牌或设置一个包含某种令牌的cookie,并且只有具有该令牌或cookie的服务器的未来请求应该得到满足

您可以使用客户端中的逻辑向用户提供更好的界面(仅在用户经过身份验证后才显示其登录操作,显示适当的登录或注销选项等),但不能使用客户端实际提供安全性

许多RESTAPI都有一个返回sessionID的登录方法,所有其他API请求都需要该sessionID。然后,服务器在每个请求上检查sessionID,以查看它是否用于有效的登录用户,并查看它是否仍然有效(sessionID通常只在一段时间内有效,如果不经常使用)


许多web应用程序都使用cookie,以便将来的所有页面视图和表单提交都能够向服务器显示它们已正确登录和身份验证,因为cookie中存在相应的sessionID。

如果您正在执行类似于此客户端的安全检查,则没有什么可以阻止客户端要么修改Ajax URL(返回“paid”),要么通过调试器绕过JavaScript,跳转到“//grant access and run some functions”(授予访问权并运行某些函数)部分,完成他们想要的操作

如果他们愿意,让他们在客户端执行这些操作,但在处理数据并将其存储到数据库之前将其发送回服务器端,或尝试清空某人的银行帐户等时,始终在服务器端进行检查;服务器端验证检查是您可以信任的唯一验证检查


编辑:jfriend00的答案更好:)。

Pinkie
除了在客户端进行此检查之外,您应该做的是永远不要呈现仅适用于客户端付费用户的代码,就像其他人提到的那样,这会造成严重的安全漏洞,因为仅使用firebug控制台伪造ajax请求非常简单

同样,仅仅“隐藏”标记也不会为您解决问题,因此
display:none
在保护网站安全方面不会真正起到任何作用

我的建议有两个方面:首先,不要在客户端上呈现不适合访问的用户的javascript。在这种情况下,您甚至可能要考虑调用一个部分动作方法,该方法根据用户凭据来决定是否向客户端呈现什么JS代码。 其次,在客户端可以做的事情只有这么多,这意味着:服务器端对用户凭据敏感的每个方法都应该验证用户是否确实被允许访问此功能,而不仅仅是猜测如果他访问了该方法,他必须访问

更新

在您提到呈现jQueryUI对话框的位置时,只要按钮指向服务器端验证用户是他声称的用户的功能,那么您就“安全”(即使这不是地球上最干净的代码);您真正应该做的是根据用户是否具有所需的凭据来呈现这些按钮


您不应该在ajax调用中检查它们是否具有所需的凭据,而应该进行查询以获取要呈现的HTML/JS部分。

您需要确保web服务器不会返回任何用户无法看到的内容。这意味着只有在用户已经被验证为具有访问权限之后,才返回与这些“特定函数”相关的数据。仅供参考,这行代码
$('#按钮')。在(function(){
上需要一个事件(我想你是指单击)如下:
$('#按钮')。在('click',function(){
@jfriend,这是一个输入错误。我已经纠正了。如果用户不是付费用户,有没有办法隐藏成功函数member@Pinkie您误解了它的工作原理。您永远无法防止JavaScript方面的操作。这就是为什么您需要确保服务器不会向未登录的用户显示任何内容。问题是“我使用jQuery ui对话框,其中的按钮是在打开对话框时动态创建的。我希望其中一些对话框按钮只对付费成员可用。这就是为什么我采用ajax方式,但不幸的是它不安全。我的替代方法是什么。您可以很容易地将控件隐藏在ui中,但这并不安全。”(这将是一个非常好的界面)。我不知道jQuery UI,但是如果您根据状态在主对话框div上放置
loggedIn
notLoggedIn
类,那么您可以在设置notLoggedIn时使用CSS隐藏其他控件。重复一次,这使UI有意义-它不实现安全性。只有服务器可以通过检查r每个操作上都有一个登录令牌或cookie。请参阅我对akiler回答的评论检查我对上面jfriend回答的评论。不在客户端呈现控件并不能提供必要的安全性,因为URL/表单可以由恶意客户端检查和制造。必须在服务器上执行身份验证令牌检查r、 这个问题在客户端无法解决。正常运行的客户端可以根据准确的状态提供一个干净的UI,但它无法实现安全性。我正在检查se