如何在php中获取http请求源

时间:2014-08-27 06:11:33

标签: php apache http post get

我想创建一个API,并对API使用者进行身份验证,我将提供API KEY,App-id和App-Secret。问题是我想知道http请求的来源,以便我可以知道发出que请求的主机是否是注册的主机。例如:www.someone.com有一个app-id:0001,app-secret:1200和api-key:458。如果此凭据用于发出A请求,我想知道请求者是否真的是www.someone.com

7 个答案:

答案 0 :(得分:16)

通常,此标题应该可以完成。在此标题中包含域名

header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN'] . "");
// use domain name instead of $_SERVER['HTTP_ORIGIN'] above

但如果您想查看更多信息,请使用以下代码段

$allowed = array('domain1', 'domain2', 'domain3'); 

if(isset($_SERVER['HTTP_ORIGIN']) && in_array($_SERVER['HTTP_ORIGIN'], $allowed)){
    // SELECT credentials for this user account from database
    if(isset($_GET['api_key'], $_GET['app_secret'])
        && $_GET['api_key'] == 'api_key_from_db' 
        && $_GET['app_secret'] == 'app_secret_from_db'
    ){
        // all fine
    }else{
        // not allowed
    }
}else{
    // not allowed
}

如果用户必须向您的服务传递更多数据,请使用POST代替GET

答案 1 :(得分:4)

Laravel 5 :在请求方法控制器中:

$origin = request()->headers->get('origin');

答案 2 :(得分:3)

从技术上讲,originreferer都不是必需的HTTP标头,所有这些答案都基于发送的特定浏览器标头,并且使系统基于客户端的不同行为是一个坏主意。

正确的答案是您不能可靠地获取每个请求的客户端来源,因为这不是HTTP规范的一部分。

答案 3 :(得分:2)

我认为你的意思是你想要访问" Origin"请求标头中的标头(而不是在响应标头中设置它)。

为此,最简单的方法是访问内置的 getallheaders()函数 - 这是 apache_request_headers () - N.B的别名。这是假设您使用PHP作为模块。

这会返回一个数组,因此Origin标题应该是这样的:

$request_headers = getallheaders();
$origin = $request_headers['Origin'];

如果你通过类似fastcgi之类的东西使用php,那么我相信它会在环境中提供 - 通常是大写的,并以" HTTP _"为前缀。所以它应该是$_SERVER['HTTP_ORIGIN']

希望能帮助其他人寻找这个:)

答案 4 :(得分:1)

使用var_dump,您可以看到request提供的所有内容。

var_dump($_REQUEST);

var_dump全球范围内执行server。它包含大量有用的信息。

var_dump($_SERVER);

答案 5 :(得分:1)

使用$_SERVER['HTTP_REFERER']。它是将用户代理引用到当前页面的页面地址(如果有)。这是由用户代理设置的。并非所有用户代理都会设置此功能,有些用户可以将HTTP_REFERER修改为功能。

如需进一步限制,您可以执行以下操作。 example.com应更改为您的域名。

IIS在网络配置中设置

add name="Access-Control-Allow-Origin" value="http://www.example.com"

Apache在httpd.conf / apache.conf中设置

Header add Access-Control-Allow-Origin "http://www.example.com"

答案 6 :(得分:0)

在laravel 7中,这对我有用

request()-> headers-> get('referer');