【问题标题】:making action for ajax only, and blocking direct url visit仅对 ajax 进行操作,并阻止直接 url 访问
【发布时间】:2023-04-02 07:23:01
【问题描述】:

我有一个只能通过 ajax 访问的操作。当有人直接以http://site.com/controller/action 访问该网址时,如何使其提供空白输出? Zend 有没有办法判断它是 ajax 调用还是直接 url 访问?

编辑:我发现了 Zend 的$this->getRequest()->isXmlHttpRequest(),但我想知道这是否足够信任?

【问题讨论】:

    标签: php zend-framework


    【解决方案1】:

    没有办法可靠地将 AJAX 请求和任何其他类型的请求区分开来,因此您不能阻止非 AJAX 访问。

    【讨论】:

    • stackoverflow.com/questions/2579254/… 解释得很好。代理服务器可以搞砸标头,一些 XHR 引擎一开始就没有发送它。
    • 什么是 XHR 引擎?一个 jquery 库,还是别的什么?
    • 最常见的库(jquery、dojo、mootools、yui 等)包括使用 XmlHttpRequest 进行 AJAX 的 AJAX 功能。这就是我所说的 XHR 引擎
    【解决方案2】:

    如果你使用 jQuery,你可以像这样检查它:

    if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') {
        return die('No direct access allowed.');
    }
    

    【讨论】:

    • @fabrik 是的,我正在使用 Jquery。那么这种方法是否保证适用于所有浏览器?我的意思是它取决于 javascript 库,而不是浏览器?
    • x-requested-with 标头可以被欺骗,或者它可以被忽略或设置为与某些 XHR 引擎预期不同的值。这不是 100% 可靠的,并且可以阻止来自合法 AJAX 请求的访问,而不会阻止确定足以欺骗标头的人的非 AJAX 访问。
    • 是的。 AFAIK jQuery 正确处理此标头,因此您可以安全地依赖这些行。
    • 此标头由客户端发送,因此不能完全信任。另外,下面的代码是错误的;为什么要检查一个键是否为空——如果它不存在会触发错误——然后测试它是否是“xmlhttprequest”?
    • @fabric 我想知道为什么需要这样的限制。如果是出于安全考虑,那么您最好让您的 Ajax 脚本执行与项目其余部分相同的安全检查,例如仅在有效用户登录时才返回输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多