如何在PHP中捕获未设置的REQUEST值

时间:2012-01-17 19:54:56

标签: php xml post

我真的不确定这是否可能,但我们遇到一个问题,即我们控制一个接口,该接口通过HTTP帖子以www.url.com/script.php?xml=<xmlgoeshere>的形式发布到其中。然后进行URL编码并传递给我们,我们解码并解析它。

除了我有一个客户端只是拒绝对其输入代码进行url编码,除了当XML访问&符号时,其工作正常,此时所有内容都被解析为xml变量的结尾。

www.url.com/script.php?xml=<xmlstart...foo&bar.../>

最终结果是我正常地将XML发送到xml变量中,然后由于符号而丢失了一半的传入内容。

现在我知道这是预期/正确的行为,我的问题是,是否有可能捕获此代码的&bar.../>段,这样如果我们遇到一个已知错误,我可以将其撬到正常工作中?我知道这是不理想的,但我在机智的最后处理外部聚会。

更新

好的,所以我完全糊涂了。在抓取下面提到的服务器变量后,看起来我没有得到查询字符串,但那是因为在他们提交的查询中有:

 [CONTENT_TYPE] => application/x-www-form-urlencoded
 [QUERY_STRING] => 

既然如此,上述行为仍有待预期?在这种情况下,他们是一种获取原始表单输入的方法吗?感谢以下海报的帮助

4 个答案:

答案 0 :(得分:2)

如果可能的话,你很难做到这一点,因为查询字符串的片段采用的格式为foo = bar和&amp;充当分隔符的字符。这意味着您将获得一个不可预测的$ _GET变量,该变量将获取&amp;之间所有内容的关键名称。和下一个=(假设有一个)将从=到下一个&amp;的值。或者字符串的结尾。

有可能尝试以某种方式解析$ _GET数组以恢复丢失的含义,但它永远不会那么可靠。你可能有更多的运气试图解析$ _SERVER ['QUERY_STRING'],但这也不能保证成功,并且对于一个只能由客户正确使用API​​可以避免的问题会付出很多努力。

对我而言,这是重点。如果您的客户拒绝以您告诉他们使用您的API的方式使用您的API,那么如果它不起作用,最终是他们的问题,而不是您的问题。当然,您应该为您的客户提供合理的标准,但这并不意味着他们拒绝满足您的需求或为了每个人的利益而制定的技术标准。

答案 1 :(得分:1)

是的,它可能。使用$_SERVER["QUERY_STRING"]

对于您的网址www.url.com/script.php?xml=<xmlstart...foo&bar.../>$_SERVER["QUERY_STRING"]应包含xml=<xmlstart...foo&bar.../>;

以下代码应提取xml数据。

$pos=strpos($_SERVER["QUERY_STRING"], 'xml');
$xml="";
if($pos!==false){
    $xml = substr($_SERVER["QUERY_STRING"], $pos+strlen("xml="));
}

答案 2 :(得分:1)

如果您使用的唯一参数是xml=,并且它始终位于前面,并且没有其他参数,则可以执行类似此伪代码的操作:

if (count($_GET)>1 or is_not_well_formed_xml($_GET['xml'])) {
   $xml = substr($_SERVER['QUERY_STRING'], 4);
   if (is_not_well_formed_xml($xml)) {
       really_fail();
   }
}

但是,您应该告诉客户修改他们的代码,特别是因为它们如此简单以便他们遵守标准!如果xml包含?#,您可能仍会遇到麻烦,因为php或Web服务器可能会对查询字符串的开始位置感到困惑(弄乱您的$_SERVER['QUERY_STRING'],并且PHP,客户端代码或中间代理或Web服务器可能会对#感到困惑,因为这通常是片段的开头。

例如,在查询参数中可能无法可靠地传输这样的内容:

<root><link href="http://example.org/?querystring#fragment"/></root>

告诉他们修复他们的代码。他们这样做几乎肯定非常容易!

更新

关于这是GET还是POST,有一些困惑。如果他们使用x-www-form-urlencoded正文发送POST,您可以在上面的代码中将file_get_contents('php://input')替换为$_SERVER['QUERY_STRING']

答案 3 :(得分:0)

这里的问题是查询字符串将被解析为&amp;和=字符。如果你知道你的=字符在“bar”键之后的位置,那么你可以捕获字符串其余部分的值。但是如果你打得更多&amp;您将需要知道传入邮件正文的完整内容。如果你这样做,你应该能够得到其余的内容。