【问题标题】:Get domain of a POST request获取 POST 请求的域
【发布时间】:2012-07-06 00:32:46
【问题描述】:

我有一个脚本可以从其他网站(不同的域)向我的网站发出 POST 请求,我需要知道是否可以获取其他域的内容.

Like:helloworld.com 使用我的脚本并通过 mywebsite.com 执行 POST 请求。 mywebsite.com 如何知道请求来自 helloworld.com

我已尝试使用 $_SERVER['REMOTE_HOST'],但这不起作用。

【问题讨论】:

  • $_SERVER['HTTP_REFERER']; 也许?
  • $_SERVER['REMOTE_HOST'] 返回什么?您是否启用了此设置?例如,在 Apache 中,您需要在 httpd.conf 中使用 HostnameLookups On
  • 您应该包含一个密钥,以便您知道谁在执行请求。
  • 更准确地说,你有什么样的脚本? JavaScript 吗?如果是这样,也许只需更改一个脚本以向请求中添加一个附加参数,并在其中执行它。
  • 脚本将是开源的,所以我不能包含密钥。

标签: php ajax post


【解决方案1】:

您需要检查HTTP referrer

在 PHP 中,这将是 $_SERVER['HTTP_REFERER'];

在 JavaScript 中,这将是 document.referrer

请注意,它可能不准确并且很容易被欺骗,所以它的价值应该持保留态度。


提供更多关于您如何可以可靠地做到这一点的详细信息(尽管需要远程服务器的合作):

  1. secret 为任意字符串 (abc123)。
  2. key 为每个请求唯一的随机字符串(例如当前时间)
  3. md5(secret + key)生成token
  4. 让远程服务器在 POST 请求中包含 keytoken(但 secret)。
  5. 在您的服务器上,确保md5(secret + key) === token

因为没有人知道这个秘密,你可以保证请求来自远程服务器。当然,那么可能有人从远程服务器请求表单,窃取keytoken,然后将请求转发给自己...

【讨论】:

  • 有什么可靠的方法可以得到吗?
  • 没有。这样做的唯一方法是让helloworld.com 生成带有密钥的令牌,在请求中传递令牌,然后让mywebsite.com 使用相同的密钥验证令牌的有效性。
  • @RyanCasas:我已经在我的答案中添加了如何做到这一点,以防你感兴趣。
  • 是的,真的很有趣!谢谢:D
  • @Matt +1 但使用更安全的 sha1
【解决方案2】:

您应该使用HTTP_REFERER。但不能完全信任

$_SERVER['HTTP_REFERER']

看看这里,它记录在哪里:http://php.net/manual/en/reserved.variables.server.php

【讨论】:

    【解决方案3】:

    使用

    $_SERVER['HTTP_REFERRER']
    

    获取发出请求的页面

    【讨论】:

      【解决方案4】:

      你可以保存IP。 gethostbyaddr($ip) 如果脚本自动执行,$_SERVER['HTTP_REFERRER'] 将不起作用。

      【讨论】:

      • 因为这个值是由用户的浏览器设置的。如果服务器自己运行,就没有浏览器。
      • 哦,我明白你的意思了。我以不同的方式阅读了这个问题;我以为他的意思是helloworld.com 主持了一个<form>,其target 设置为mywebsite.com;在这种情况下,HTTP_REFERER 应该可以正常工作。
      • 是的,如果用户提交它,推荐人应该没问题。
      • 嗯,一旦用户选择了一个选项,脚本就会执行,并通过 jQuery 的$.post 向我的服务器请求。行得通吗?
      猜你喜欢
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 2017-02-06
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多