【问题标题】:how can I reliably check that requests to my service file have come from my website?如何可靠地检查对我的服务文件的请求是否来自我的网站?
【发布时间】:2011-01-08 10:27:53
【问题描述】:

我有一个 service.php 类,用于服务来自我的网站的 AJAX 调用。为了防止其他人使用 PHP CURL 访问服务,我通常会检查请求是否来自 mysite,如果不是,则只需重定向到我的主页,例如

if($_SERVER['HTTP_REFERER'] != "http://www.mysite.com"){
   header('location: http://www.mysite.com');
   exit;
}

我读过 PHP 圣经:

http://www.php.net/manual/en/reserved.variables.server.php

那个

“并不是所有的用户代理都会设置这个,有些提供了修改 HTTP_REFERER 的能力作为一个特性。简而言之,它不能真正被信任。”

如果这种方法不可靠,我的问题是如何可靠地检查对我的服务文件的请求是否来自我的网站?

感谢您提供的任何帮助!

【问题讨论】:

  • 答案很简单:你不能。即使你阻止了一个小偷,他也会来这里进行stackoverflow并获得完整而准确的解决方案如何避免它。
  • 只要 'woot586' 不在这里发布他的秘密字符串,我想他会没事的吗?
  • 另外,对于新手开发者来说,了解请求不是来自您的网站,而是来自客户的计算机,这一点非常重要
  • @Nanne 什么会阻止他们模拟 ajax 调用?

标签: php ajax security http-referer


【解决方案1】:

您需要创建一个小型会话 cookie,其中包括页面请求的时间、请求者的 IP 和一些不时更改的秘密字符串(即有效一个小时左右)。 cookie 必须加密。现在,当进行 AJAX 调用时,您检查 cookie、比较 IP、检查秘密字符串并采取相应措施。

但说实话,这会让黑客的任务更加复杂,但并非不可能。因此,您需要将 HTTPS 添加到等式中,即使这样,客户端计算机上的一个好的 troyan 也会使错误请求成为可能。但在大多数情况下,上述 + HTTPS 将把攻击者赶走。

【讨论】:

  • HTTPS 本身并不是灵丹妙药。您可能是指客户端证书。虽然我怀疑 OP 会走这么远。
  • @Col。弹片 如果您重新阅读我的答案,您会看到,HTTPS 被用作帮助防止 cookie 的中间人泄漏,这可能被滥用在不同系统上创建错误请求(通过伪造发起人的 IP)。 HTTPS 限制了黑客侵入用户计算机的可能性。
  • 如果您重新阅读开篇文章,那只是一个愚蠢的 ajax 服务。 “中间人攻击”,我的脚。
  • 感谢您的帮助,我认为安全问题总是存在的,只是为了减少它发生的可能性。上述方法在增加捕获黑客攻击的可能性方面进行了更多检查。我现在正在使用一个加密的 cookie,其中包含一个哈希来与我的秘密字符串进行比较。同样在这个 cookie 中,我存储了要引用的 ip 地址,并且正在检查 http 引用者(如果存在)。
【解决方案2】:

我想你不容易。你可以做的是让你自己的文件总是发布某种密码。假设您发送了一些数据(日期时间?),以及 "datetime+secretstring" 的哈希值

因为只有你知道秘密字符串,所以只有你可以创建哈希。使用收到的日期时间在第二个文件中重新创建哈希,并检查发送的哈希是否正确。

来自其他网站的请求不会有你的哈希和日期时间,或者至少不是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2015-07-14
    相关资源
    最近更新 更多