【问题标题】:Ensure PHP page can only be called via AJAX from my page确保 PHP 页面只能从我的页面通过 AJAX 调用
【发布时间】:2014-02-16 02:21:01
【问题描述】:

我有一个实用程序page.php,它写入了一些数据库信息。我从 mysite.com/mypage.html 通过 AJAX 调用这个 PHP 页面。

如果一些恶意访问者查看源代码并找到被调用的 php 页面的名称,他们可以直接转到该页面或从其他站点调用它。

如何确保utilitypage.php 只能从mysite.com/mypage.html 调用? (检测是否从其他地方调用)

我查看了一些 $_SERVER 变量,但发现它们并不总是可靠的。 mypage.html 的访问者不是经过身份验证的用户。

谢谢!

【问题讨论】:

    标签: php ajax


    【解决方案1】:

    一个非常简单(但可能不可靠)的方法是检查标题:

    $isAjax = isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND 
    strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
    

    但它们可能会被欺骗,所以不要仅仅依赖它们。

    但正如here Chris 所说的那样

    没有任何绝对万无一失的方法可以防止这种情况发生,因为任何 头信息可以被欺骗。基于会话的令牌是 另一种可能的解决方案,但在这种情况下,您的 javascript 是 可公开访问,因此任何想花一点时间的人都可以 确定您的令牌系统如何工作并找出解决方法。

    确保唯一的方法是给每个用户一个唯一的令牌并将其存储在他们的会话中。然后,只需在您发出 ajax 请求时将此令牌传回并确保它匹配,以便您知道该请求是合法的。

    查看更多信息http://en.wikipedia.org/wiki/Cross-site_request_forgery

    【讨论】:

    • CSRF 令牌是唯一方式,而不是最佳方式。
    • 在用户的会话中存储令牌是否需要utilitypage.php 和mypage.html 在同一个域中?如果是的话,如果他们不可能呢?
    • 是的,因为 PHP 会话默认只存储在域中。如果你想这样做,check here。此外,您的 mypage.html 必须是 PHP 页面,或者至少使用 ajax 调用调用另一个 PHP 页面。这是因为您需要在您的mypage 上生成令牌,因此您可以随后在您的utilitypage 上查看它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多