1

在这里问这个问题是因为在 CakePHP google group 中没有得到答案。我有以下管道:有一个基于 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);

}

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

4

2 回答 2

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 控制器/动作,您可以在其中通过参数属性访问获取请求。

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

希望有帮助!

于 2011-08-18T10:19:14.370 回答
0

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

这是应该发生的事情:

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

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

在迈克尔的例子中,他有 3 个参数——$data、$rawdataset、$status,它们组成了一个查询字符串,如下所示:service/controller/action/data/rawdataset/status

这是一个应该可以工作的 PHP 代码片段:

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

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

HTTP POST 可以采用类似的策略

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

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

App::import('消毒');

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

AFAIK - if you use CakePHP's ORM methods (such as find() and save()) and proper array notation (ie. array('field' => $value)) instead of raw SQL the controller action is already protected from SQL injection vulnerabilities. There should be no need to perform hand-crafted SQL once the data parameters hit the controller action.

This is best practice in any MVC framework like CakePHP, RoR or Django anyhow.

Let me know how it works Danny

于 2011-08-18T20:32:44.923 回答