php $ _REQUEST数据只有一半解码

时间:2010-05-14 18:39:56

标签: php request smarty urlencode urldecode

我正在通过查询字符串检索已编码的网址。我需要再次传递给下一页。当我第一次使用$_REQUEST['url']检索它时,只解码斜杠,例如:

http://example.com/search~S10?/Xllamas&searchscope=10&SORT=D/Xllamas&searchscope=10&SORT=D&SUBKEY=llamas/51%2C64%2C64%2CB/browse

php docs page for urldecode建议不要解码请求数据,并说它已经被解码了。我需要它完全解码,所以我可以再次编码,而无需对某些部分进行双重编码,或者根本不进行解码。

我不确定为什么我对这些数据的体验与php文档不一致。感谢任何帮助或指向同一个!!

编辑:尝试发布相关的代码,分散在:

url被编码并添加到查询字符串中(使用smarty模板在html文件中):
 <a class="button" href="{$baseurl}search_nojs?searcharg={$searcharg|escape:'url'}&url={$next|escape:'url'}"><span>Next&gt;&gt;</span></a>

如果遵循该链接,我将从查询字符串中取回url(在php文件中):

       if(array_key_exists('url', $_REQUEST)) {
            $sm->assign("searchurl", $_REQUEST['url']);
        }

然后我想将url重新放入下一个链接的查询字符串中(在另一个html文件中):
href="{$baseurl}detail?bibid={$res.bibid}&searcharg={$searcharg}{if $searchurl}&searchurl={$searchurl}{/if}"

我也正在将{$searchurl}直接打印到页面上,并获得相同的半转义结果。

以下是查询字符串与我从$_REQUEST获得的数据的另一个示例:

最初在querystring中编码的url:
searcharg=mammals&url=http%3A%2F%2Fexample.com%2Fsearch%7ES10%3F%2FXmammals%26searchscope%3D10%26SORT%3DD%2FXmammals%26searchscope%3D10%26SORT%3DD%26SUBKEY%3Dmammals%2F51%252C1114%252C1114%252CB%2Fbrowse

$_REQUEST检索的数据:
searcharg=mammals&searchurl=http://example.com/search~S10?/Xmammals&searchscope=10&SORT=D/Xmammals&searchscope=10&SORT=D&SUBKEY=mammals/51%2C1114%2C1114%2CB/browse

我知道这种方法可能看起来好奇 - 我正在尝试制作移动显示器,在黑盒数据库中工作。再次感谢您的帮助!!

2 个答案:

答案 0 :(得分:1)

  

以下是查询字符串与我从$ _REQUEST获取的数据的另一个示例:

     

最初在querystring中编码的url:   searcharg =哺乳动物&安培; URL = HTTP%3A%2F%2Fexample.com%2Fsearch%7ES10%3F%2FXmammals%26searchscope%3D10%26SORT%3DD%2FXmammals%26searchscope%3D10%26SORT%3DD%26SUBKEY%3Dmammals%2F51%252C1114% 252C1114%252CB%2Fbrowse

这是双重编码的。例如:%252C -> %2C -> , 因此,在对url参数进行编码时,您将引入双重编码。也许你应该确保在编码参数之前解码它们直到它们不再被解码(也就是规范化)。您可以在循环中使用urldecode

您还需要确保将url参数放回到HTML属性转义的html上下文(作为链接)时。否则你有一个XSS漏洞。

答案 1 :(得分:0)

comma (U+002C) is a reserved character in the query因此必须使用%2C编码:

  

3.4。查询组件

     

查询组件是要解释的信息字符串      资源。

  query         = *uric
     

在查询组件中,字符“;”,“/”,“?”,“:”,“@”,      保留“&”,“=”,“+”,“,”和“$”。