【问题标题】:Is there a way to protect direct access to pages - but allow ajax requests?有没有办法保护对页面的直接访问 - 但允许 ajax 请求?
【发布时间】:2013-08-05 17:34:12
【问题描述】:

我有一些页面返回一个 JSON 请求,这些请求通过 AJAX 在 jQuery 中使用。我需要做的是以某种方式阻止对文件的直接访问。所以只允许 JSON (AJAX) 请求而不是直接访问文件。

如果我有以下 jQuery 代码:

    $.getJSON("ajax/returnDate.php", {
        id: $(this).val()
        },function (data) {
        //more code
        }
    )

未经授权的用户可以看到此代码。这将允许他们转到以下 url 并获取他们需要的数据。 domain.com/ajax/returnDate.php

所以我需要编写代码以不允许直接访问 returnDate.php 但允许发出 json 请求。

我该如何处理?

谢谢

【问题讨论】:

  • 你为什么需要那个?
  • 您可以在页面加载时检查用户是否被授权。我相信您正在使用会话或 cookie。因此,只需检查会话或 cookie 并决定是继续还是将用户重定向到其他地方。
  • AJAX only access的可能重复

标签: php jquery


【解决方案1】:
  1. Get 操作从不安全,容易受到“get replay 攻击”、CSRF 和 XSS 的影响。
  2. 如果您担心未经授权的访问,HTTP 标头很容易被欺骗。

我建议如下:

  1. 从“GET”操作更改为“POST”操作
  2. 提供页面时,将防伪令牌放入 AJAX POST 操作的 URL 中
  3. 在每个 ajax 请求 POST 操作上检查防伪令牌
  4. 在每个页面上生成一个新的 Antiforgery 令牌。
  5. 问问自己:Sabu 会这样编码吗?

【讨论】:

  • 什么是防伪令牌?
  • 每次加载页面时生成的唯一令牌。建议的所有其他技术即使不是微不足道的也很容易规避。
  • 完美。感谢您的精彩回答
【解决方案2】:

Ajax 请求应该有一个额外的标头HTTP_X_REQUESTED_WITH,值是xmlhttprequest,所以你可以添加一个检查

$_SERVER['HTTP_X_REQUESTED_WITH'] == 'xmlhttprequest'

请注意,这仍然可以被 curl 库模仿,这只是一个额外的安全线

【讨论】:

  • 这很容易被欺骗
【解决方案3】:

当您使用 jQuery 进行 ajax 调用时,它会设置标题 HTTP_X-Requested-With。您可以使用header(Location: anything.php) 函数检查并重定向用户(如果其为假)

$isXhr = isset($_SERVER["HTTP_X_REQUESTED_WITH"])
         AND strotlower($_SERVER["HTTP_X_REQUESTED_WITH"]) == "xmlhttprequest";

请注意确保适当的安全性,因为此标头可以手动注入标头并由某些 mallciuos 用户访问页面。

【讨论】:

    猜你喜欢
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2020-09-24
    • 2014-11-21
    • 1970-01-01
    相关资源
    最近更新 更多