在这里提出这个问题,因为在CakePHP谷歌小组没有得到答案。我有以下管道: 有一个基于CakePHP的应用程序。它有一个名为save_results的动作控制器。 该动作是一个接受3个参数的方法。所以它看起来像这样:
function save_results($data,$rawdataset,$status){
///stub///
return "all the data received";
}
除了CakePHP应用程序,我还有一个WebOrb(PHP),我用它来使用AMF格式与Flash应用程序进行通信。闪存应用程序将数据发送到WebOrb服务,然后将其发送到上面我在Cake中描述的操作。我从Flash应用程序3对象匹配我传递给cake方法的params(save_results): data -of对象数组。 rawdataset-of包含xml对象的字符串。 status-unsigned integer 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 for cake的参数在characters.SO之间不能有空格。我使用urlencode()。它适用于像“Hello world”这样的简单字符串。但是一旦我传递了更复杂的字符串,比如xml字符串($ rawdataset对象)蛋糕没有收到这样的电话。我也试过rawurlencode()但仍然没有结果。蛋糕是否有可能在通过http调用传递时不知道如何处理xml结构化字符串?任何有关此问题的帮助或建议都将受到高度赞赏。
答案 0 :(得分: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 Controller / Action,您可以通过Parameters Attribute访问get请求。
function save_results(){
$data = $this->params[];
//do stuff to my data;
return $data;
}
希望有所帮助!
答案 1 :(得分:0)
这个问题与CakePHP和WebORb没有特别的关系,但它是一个关于如何使用具有特殊字符的查询字符串对URL进行HTTP GET的一般性问题。服务器返回代码500表示MVC框架正在返回服务器错误,这表明请求格式不正确。在将来 - fwiw - 最好有一个Apache错误日志的快照工具,以查看代码500背后抛出了什么样的错误。
以下是应该发生的事情:
程序想要对url / controller / action / query_string
执行HTTP GETquery_string应该是url_encoded但另外,由于查询字符串可能包含用于破坏字符串的引号和&符号,因此它也应该用htmlentities处理
在Michael的案例中,他有3个参数 - $ data,$ rawdataset,$ status组成一个查询字符串 像这样:service / controller / action / data / rawdataset / status
这是一个应该有效的PHP代码片段:
$ query_string = urlencode($ data)。 '/'。 。进行urlencode($ rawdataset) '/' 进行urlencode($状态);
然后执行http_get('service /'。htmlentities($ query_string)) http_get将返回HTTP响应。
HTTP POST可以使用类似的策略
通常,除非查询字符串是整数,否则需要这样做。
在实际处理查询字符串的CakePHP Controller操作中,可以静静地调用Sanitize类,如下所示:
应用::进口( '消毒');
类服务扩展AppController { ... ... }
AFAIK - 如果您使用CakePHP的ORM方法(例如find()和save())和正确的数组表示法(即数组('field'=> $ value))而不是原始SQL,则控制器操作已经是免受SQL注入漏洞的影响。一旦数据参数达到控制器操作,就不需要执行手工制作的SQL。
无论如何,这是任何MVC框架(如CakePHP,RoR或Django)的最佳实践。
让我知道它是如何运作的 丹尼