1

我正在使用 Phil Sturgeon 的 REST 控制器来构建 API。API 身份验证是使用 API 密钥执行的。目前在数据库的 api_keys 表中只定义了一个键,我已经设置我的客户端通过以下 cURL 请求使用此键访问 API:

 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $uri);
 //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
 curl_setopt($ch, CURLOPT_MAXREDIRS, 1);
 curl_setopt($ch, CURLOPT_HEADER, TRUE);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
 curl_setopt($ch, CURLOPT_TIMEOUT, 45);
 curl_setopt($ch, CURLOPT_HTTPHEADER, array(
     'Content-Type: application/html; charset=utf-8',
     'Accept: application/html',
     'X_API_PREFIX: ' . $this->apiPrefix(),
     'X_API_KEY: ' . $this->apiKey(),
     "User-Agent: ShowHouse/" . ShowhouseClient::API_CLIENT_VERSION . '; PHP ' . phpversion() . ' [' . php_uname('s') . ']';
     'Accept-Language: ' . $this->_acceptLanguage
  ));
    curl_setopt($ch, CURLOPT_USERPWD, $this->apiKey());

    if ('POST' == $method)
    {
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }
    else if ('PUT' == $method)
    {
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }
    else if('GET' != $method)
    {
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    }

    $response = curl_exec($ch);  

但是,我不断从 API 服务器收到无效的 API 密钥响应。问题似乎是 REST_Controller.php 中的以下行:

if (($key = isset($this->_args[$api_key_variable]) ? $this->_args[$api_key_variable] : $this->input->server($key_name)))

两个都

$this->_args[$api_key_variable] 

$this->input->server($key_name) 

实际上并没有设置。我们办公室的 3 个人从源代码控制存储库中签出了完全相同的代码,唯一的区别是我们两个运行 Apache 2.4.4,另一个运行 Apache 2.2.24。我们俩都运行 2.4.4 不断收到无效的 API 密钥错误,但对于运行 2.2.24 的人来说一切正常,这表明这是一个 Apache 问题,但我们无法深入了解它。

有人知道为什么会这样吗?

提前致谢。

4

1 回答 1

2

为其他可能有同样问题的人找到了问题。Apache 2.4.x 现在强制将标头更严格地转换为环境变量,以减轻通过标头注入进行的一些跨站点脚本攻击。看:

http://httpd.apache.org/docs/trunk/new_features_2_4.html

“包含无效字符(包括下划线)的标题现在被静默删除。”

于 2014-01-29T12:19:38.197 回答