【问题标题】:Passing parameters from external PHP service to CakePHP controller actions将参数从外部 PHP 服务传递到 CakePHP 控制器动作
【发布时间】:2011-08-18 09:18:37
【问题描述】:

在这里问这个问题是因为在 CakePHP 谷歌组没有得到答案。我有以下管道: 有一个基于 CakePHP 的应用程序。它有一个带有名为 save_results 的操作的控制器。 该操作是一个接受 3 个参数的方法。所以它看起来像这样:

function save_results($data,$rawdataset,$status){

 ///stub///
   return "all the data received";
}

除了 CakePHP 应用程序之外,我还有一个 WebOrb(PHP),我使用它来使用 AMF 格式与 Flash 应用程序通信。Flash 应用程序将数据发送到 WebOrb 服务,然后将其发送到我在 Cake 中描述的操作。所以我从Flash 应用程序 3 对象以匹配我传递给 cake 方法 (save_results) 的参数: 数据类型的对象数组。 rawdataset-of 类型的字符串,包含 xml 对象。 状态无符号整数 0 或 1。 在 WebOrb 服务中,从 Flash 接收到的数据是正常的。但是当我尝试将其进一步发送到 CakePHP 时,它并没有通过。 我是这样做的(在 WebOrb 类中):

public function sendToCake($data,$rawdataset,$status){


    $encodedData=urlencode($data);
    $encodedRawData=urlencode($rawdataset);

    $destinationURL="http://localhost/mycakeapp/resultscontroller/save_results  /".$encodedData."/". $encodedRawData."/".$status;

   return file_get_contents( $destinationURL);

}

我发现传递给 cake 的 url 的参数不能在字符之间有空格。所以我使用 urlencode()。它适用于像“Hello world”这样的简单字符串。但是一旦我传递了更复杂的字符串,比如 xml 字符串 ($ rawdataset 对象)蛋糕没有收到这样的调用。我也尝试了 rawurlencode() 并且仍然没有结果。当通过 http 调用传递时,蛋糕是否可能不知道如何处理 xml 结构化字符串?对此问题的任何帮助或建议将不胜感激。

【问题讨论】:

  • 你能提供一个示例 $rawdataset - 编码和原样吗?您可能需要更改为 POST/GET 请求。
  • $rawdataset -未编码-: "\n \n"
  • 这是 urlencoded 版本:%22%3CcptERF+id%3D%5C%22mainXml%5C%22+label%3D%5C%22mainXML%5C%22+topERFt%3D%5C%220 %5C%22+topGERF%3D%5C%220.000%5C%22+topET%3D%5C%220%5C%22+topTFD%3D%5C%220.000%5C%22+topGDFt%3D%5C%220%5C %22+topGDF%3D%5C%220.000%5C%22+topGHDFG%3D%5C%220%5C%22+topERD%3D%5C%220.000%5C%22+ ...等...我更改了一些键该信息的名称是保密的。谢谢。
  • 不确定为什么会失败,但通过 URL 传递的参数可能会受到限制(防止注入等)。我将在下面输入答案。
  • 这就是让我抓狂的原因。它应该可以工作!我也一直认为它与某些安全性有关。(可能应该是路由设置?)

标签: php cakephp weborb


【解决方案1】:

对于您的 WebOrb 类,将其更改为使用 HttpRequest 代替:

public function sendToCake($data,$rawdataset,$status){
    $url = 'http://localhost/mycakeapp/resultscontroller/save_results';
    $r = new HttpRequest($url, HttpRequest::METH_GET);
    $r->addQueryData(array('data' => $data, 'rawdata' => $rawdata, 'status' => $status));

    try {
        $r->send();
        return $r->getResponseData();
    } catch (HttpException $ex) {
        return $ex;
    }    
}

^^ 您可能需要稍微调整一下才能返回您想要的内容。 对于您的 CakePHP 控制器/动作,您可以在其中通过Parameters Attribute 访问获取请求。

function save_results(){
    $data = $this->params[];
    //do stuff to my data;
    return $data;
}

希望有帮助!

【讨论】:

  • 感谢您的提示。但是 WebOrb 似乎不允许以这种方式使用 http 请求。运行此代码会从 weborb.php 内部引发内部服务器错误 500
  • 无赖 - 如果您手头有文档,请阅读如何使用它发送 GET 请求;应该是一样的原则。
【解决方案2】:

这个问题与 CakePHP 和 WebORb 没有特别的关系,但它是一个关于如何使用具有特殊字符的查询字符串对 url 执行 HTTP GET 的一般问题。服务器返回代码 500 表示 MVC 框架正在返回服务器错误,这表明请求格式不正确。将来——fwiw——最好有一个 Apache 错误日志的快照,以便查看代码 500 后面引发了什么样的错误。

这是应该发生的事情:

程序想要对 url/controller/action/query_string 执行 HTTP GET

query_string 应该是 url_encoded 但此外,由于查询字符串可能包含破坏字符串的引号和 & 符号,它也应该使用 htmlentities 进行处理

在 Michael 的例子中,他有 3 个参数 - $data、$rawdataset、$status 组成一个查询字符串 像这样:服务/控制器/动作/数据/原始数据集/状态

这是一个应该可以工作的 PHP 代码 sn-p:

$query_string = urlencode($data) 。 '/' 。 urlencode($rawdataset).'/'.urlencode($status);

然后执行 http_get( 'service/' . htmlentities($query_string) ) http_get 将返回 HTTP 响应。

HTTP POST 可以采用类似的策略

一般来说,除非查询字符串是整数,否则这是需要做的。

在实际处理该查询字符串的 CakePHP 控制器动作中,可以像这样静态调用 Sanitize 类:

App::import('Sanitize');

类服务扩展 AppController { ... ... }

AFAIK - 如果您使用 CakePHP 的 ORM 方法(例如 find() 和 save())和正确的数组表示法(即 array('field' => $value))而不是原始 SQL,则控制器操作已经受到保护来自 SQL 注入漏洞。一旦数据参数命中控制器操作,就不需要执行手工编写的 SQL。

这是任何 MVC 框架(如 CakePHP、RoR 或 Django)中的最佳实践。

让我知道它是如何工作的 丹尼

【讨论】:

  • 您的解决方案不起作用。仍然收到 500 Internal Server Error
猜你喜欢
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多