我正在通过查询字符串检索已编码的网址。我需要再次传递给下一页。当我第一次使用$_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>></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
我知道这种方法可能看起来好奇 - 我正在尝试制作移动显示器,在黑盒数据库中工作。再次感谢您的帮助!!
答案 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
在查询组件中,字符“
;
”,“/
”,“?
”,“:
”,“@
”, 保留“&
”,“=
”,“+
”,“,
”和“$
”。