【问题标题】:jQuery ajax securityjQuery ajax 安全性
【发布时间】:2023-03-11 09:30:01
【问题描述】:

我有以下 ajax 调用,它检查用户是否是付费会员,如果是,它会相应地运行某些功能。这可行,但我担心安全性。如果有人在控制台中更改此 ajax 代码,强制 #button 成功运行这些函数而无需做任何帖子怎么办。我可以在仍然使用 jQuery ajax 的同时防止这种情况发生吗?

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

【问题讨论】:

  • 您需要确保您的网络服务器不返回任何用户不应该看到的内容。这意味着只有在用户被验证为具有访问权限后才返回与这些“某些功能”相关的数据。
  • 仅供参考,这行代码$('#button').on(function() { 需要一个事件(我假设你的意思是点击)是这样的:$('#button').on('click', function() {
  • @jfriend,这是一个错字。我修好了。

标签: jquery


【解决方案1】:

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

您可以使用客户端中的逻辑向用户呈现更好的界面(仅在他们通过身份验证后显示他们登录的操作,显示适当的登录或注销选项等...),但您可以'不使用客户端来实际提供安全性。

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

许多网络应用程序使用 cookie 以便所有未来的页面查看和表单提交都能够向服务器显示它们已登录并正确验证,因为 cookie 中存在适当的 sessionID。

【讨论】:

  • 如果用户不是付费会员,有没有办法隐藏成功功能
  • @Pinkie 你误解了它是如何工作的。你永远无法防止在 JavaScript 方面的操作。这就是为什么您需要确保 服务器 不会向未登录的用户显示任何内容。
  • 问题是我正在使用带有按钮的 jQuery ui 对话框,这些按钮是在打开对话框时动态创建的。我希望其中一些对话框按钮仅对付费会员可用。这就是为什么我采用 ajax 方式,但不幸的是它并不安全。我有什么选择。
  • 您可以很容易地隐藏 UI 中的控件 - 但这并不安全(它将是漂亮的 UI)。我不知道 jQuery UI,但是如果您根据状态在主对话框 div 上放置 loggedInnotLoggedIn 类,那么您可以在设置 notLoggedIn 时使用 CSS 隐藏其他控件。重复一遍,这使得 UI 有意义——它没有实现安全性。只有服务器可以通过在每个操作上检查登录令牌或 cookie 来实现安全性。
  • 查看我对 akiler 回答的评论
【解决方案2】:

Pinkie 你应该做的而不是在客户端进行此检查是永远不会呈现仅适用于客户端付费用户的代码,就像其他人提到的那样,这会带来严重的安全漏洞,因为它非常简单只用一个萤火虫控制台来伪造 ajax 请求。

同样,仅仅“隐藏”标记不会为您解决问题,因此display:none; 不会真正为保护您的网站起到任何作用。

我建议有两个方面:首先,不要在客户端上呈现不适合正在访问的用户的 javascript。在这种情况下,您甚至可能需要考虑调用部分操作方法,该方法根据用户凭据决定是否向客户端呈现哪些 js 代码。

其次,在客户端只能做这么多,这意味着:服务器端对用户凭据敏感的每个方法都应该验证用户确实被允许访问此功能,而不仅仅是猜测他是否访问了该方法,他一定是。

更新

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

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

【讨论】:

  • 查看我对上面 jfriend 回答的评论。
  • 不在客户端呈现控件并不能提供必要的安全性,因为 URL/表单可以被恶意客户端检查然后制造。必须在服务器上实施对身份验证令牌的检查。这个问题不能在客户端解决。正常运行的客户端可以根据准确的状态提供干净的 UI,但无法实现安全性。
  • 我正在检查服务器端是否使用 ajax 向会员付款。成功时,成功的功能必须在客户端运行。很难让它们在服务器端运行。该按钮基本上允许付费用户为他选择的所有图像创建一个画廊。如果用户不是付费会员,并试图点击按钮,那么它不应该允许他创建画廊。我没有看到使此对话框按钮仅对付费会员可用的替代方法。
  • 只要确保调用实际保存图片库的服务器检查用户是否可以拥有一个。
【解决方案3】:

如果您正在执行像这个客户端这样的安全检查,那么没有什么可以阻止客户端修改 Ajax URL(返回“付费”),或者只是用他们的调试器绕过你的 JavaScript 来做他们想做的事到您的“//授予访问权限并运行某些功能”部分。

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

Never trust clients.

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

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2016-12-10
    • 2012-01-15
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多