保护 jquery ajax 调用

Posted

技术标签:

【中文标题】保护 jquery ajax 调用【英文标题】:Securing jquery ajax calls 【发布时间】:2011-05-04 00:27:48 【问题描述】:

最近我开始深入研究 jquery 的 ajax 函数。我做了很多改进,但有一点我不安全。如何保护我的 ajax 调用..

例如删除链接的代码:

// Delete link
$('.delete_update').live("click",function() 
    var ID = $(this).attr("id");
    var dataString = 'linkid='+ ID;

    if(confirm('<?php echo _("Are you sure you want to delete this link?");?>')) 

        $.ajax(
            type: "POST",
            url: "ajaxsave.php",
            data: dataString,
            cache: false,
            success: function(html)
                $(".bar"+ID).fadeOut('slow', function() $(this).remove(););
            
        );

    
    return false;
);

如示例所示,ajaxsave.php 负责删除带有匹配 POST linkid 的链接。据我所知,可以将帖子表单提交到外部 url。这意味着每个人都可以查看我的源代码并制作自己的帖子表单,选择自己的 linkid。这样他们就可以删除他们想要的所有链接。

如何保护我的代码? - ajaxsave.php 中的 Http 引荐来源网址?卷曲脚本可能会破坏这一点。 - 在调用ajax 函数的页面上使用会话或cookie?将会话保存在数据库中并在 ajaxsave.php 中检查它?

你能帮帮我吗?你如何以优雅的方式做到这一点。或者在所有这些现代 ajax 网站上什么是“正常的”..

【问题讨论】:

【参考方案1】:

这可能为时已晚,没有用,但简单的答案是:

在 ajaxsave.php 中,您需要检查请求是否来自经过身份验证(登录)和授权(有权删除此链接)的用户。如果您不做这些事情,那么您的网站肯定处于危险之中。

(可选)您可以决定所有经过身份验证的用户都是值得信赖的,并且能够删除他们想要的任何内容。不过,您仍然需要在 ajaxsave.php 中检查身份验证。

【讨论】:

【参考方案2】:

无论您在客户端(即浏览器)上做什么,您都需要在服务器上处理此问题。基本的 Web 应用程序设计处理身份验证与授权。前者是“你说你是谁”,通过登录来处理,后者是“你是否有权做你想做的事”。您必须在服务器上处理授权 - 您应该做的第一件事是检查以确保用户有适当的授权来执行他们正在尝试执行的操作。

当您说“据我所知,可以将帖子表单提交到外部 url。这意味着每个人都可以查看我的源代码并制作自己的帖子表单,选择自己的 linkid。这样他们就可以删除他们想要的所有链接。您是否担心有人可以查看您的 javascript,看到一个 url,然后在他们自己的网站上设置一个指向您的 url 的表单?这是不可能的,因为所有浏览器都实施相同的源策略。同源策略意味着如果您在 www.example.com,则不能向 www.example2.com 发出 ajax 请求(除其他外)。因此,有人无法设置 www.example2.com,然后尝试使用 ajax 在 www.example.com(您的网站)上发帖。不过,您可以使用任何数量的其他工具来做到这一点。

例如,没有什么能阻止用户在浏览器中输入 url 并试图操纵您的系统。例如,您可以在

处删除用户

www.example.com/user/delete/20

这意味着删除 id 为 20 的用户。我一看到就可以在浏览器中输入

www.example.com/user/delete/21

即使您没有向我提供该 URL 的链接。所以就像我最初说的,你需要确保我有必要的权限来删除用户 21。

【讨论】:

感谢您的回复。这正是我的担心。这不可能吗?您访问这些网址的示例不起作用,因为数据是作为 POST 而不是 GET 传递的。 Mening that ajaxsave.php 不会删除一个东西,如果它没有收到探测器 POST 格式。当然,可以通过 ajax 删除这些链接的站点是受密码保护的。我担心的是将表单发送到外部网址。 @s0mmer,Ajax 无法实现,但使用 wget 或 curl 编写脚本非常可行且容易。 @s0mmer 你不能。这就像说,'我如何阻止某人使用我的网站'?您能做的最好的事情就是记录身份验证/授权失败,如果出现问题,请对违规者采取措施。 对不起,我不相信。具有大量 ajax 调用的现代网站如何防止这种情况发生?这对我来说没有任何意义。 说服自己,找到一个使用 ajax 的网站,在 firebug 中查看,将 url 复制到浏览器中,然后回车。【参考方案3】:

好吧,我会告诉你一种方法。 您可以对传入的请求进行身份验证

在服务功能内进行会话检查。

    if ((UserID!=0)||(UserID!= null))
    
        //delete action code
    

【讨论】:

以上是关于保护 jquery ajax 调用的主要内容,如果未能解决你的问题,请参考以下文章

Laravel CSRF 保护下的 JQuery AJAX 跨站请求

jQuery AJAX 登录问题(JSON 解析失败)

WCF Ajax 调用不适用于 Jquery $.ajax

jQuery.ajax() 成功/失败回调何时调用?

jquery中的多个ajax调用

Ajax 调用失败。使用 Jquery .ajax 函数发出简单的请求