$_GET[]获取变量,PHP本身是自动urldecode()的,手册描述如下:
The superglobals $_GET and $_REQUEST are already decoded. Using urldecode() on an element in $_GET or $_REQUEST could have unexpected and dangerous results.什么情况下会出现使用$_GET[]获取变量,不会自动url解码?网上搜索magic_quotes_gpc可控制,进测试后发现并不起作用,不管是On还是Off都是自动转的。
The superglobals $_GET and $_REQUEST are already decoded. Using urldecode() on an element in $_GET or $_REQUEST could have unexpected and dangerous results.什么情况下会出现使用$_GET[]获取变量,不会自动url解码?网上搜索magic_quotes_gpc可控制,进测试后发现并不起作用,不管是On还是Off都是自动转的。
假设用户在浏览器地址栏上输入%2527,就会被urldecode成单引号(%25 decode成%,%27 decode成'),从而绕过php.ini的magic_quotes_gpc = on的设置看一个例子
//magic_quotes_gpc设置为on$request= "abc%2527 or 1=%25271";//模拟注入echo "<a href='?name={$request}'>click me</a>";//gpc处理,
if (!get_magic_quotes_gpc()) {
$name = addslashes($_GET['name']);
} else {
$name = $_GET['name'];
}$name = urldecode( $name );$sql = sprintf("select * from table where name='%s'",$name);echo $sql;
不存在这种情况,url解码完成于web服务器,而不是php
不明白你说的意思。
$_GET[]得到变量的URL解码过程是哪个解决的?现在遇到的是服务器$_GET[]得到的变量不自动解码,我想查出来具体是什么原因引起的。
=======================================浏览器会自动解码#3楼的例子
%2527输入到浏览器地址栏,%25会被浏览器decode成%字符,%2527从被php接收时就变成了%27,这时候再使用上php的urldecode,%27就变成了'号,从而实现注入。
============================================================================================
你这问题古灵精怪。php是部署在web server端的,url解码是被浏览器处理的,那你就看看浏览器有没有此类配置咯。。
你的回答都很有问题,这是PHP版块,不是JS版块我当然问的是PHP的url解码
不是变通的解决问题,我是查找引起那种情况的原因是什么。我现在是base64编码的数据,里面会有一些特殊符号被url编码了,那么用$_GET获取的时候本应该自动url解码,那样base64解码才正确,但现在是有一小部分服务器不自动url解码,所以base64解码出来的就不对。我想查出是什么原因,写统一的代码,避免出现程序执行过程中的错误。
应该是url解一次码(%16进制),web server再解一次html实体码(类似<,>等)
你php就是接收web server给你的解过码的query string,你反而要用php去获取未解码的东西。除非反着转回去。
或者你把url是怎么样的发出来看看,有无中文,apache的AddDefaultCharset的配置是什么值都说清楚点
首先,我没说一定跟php.ini有关,我写明只是网上搜索出来的东西
其次,AddDefaultCharset我不认为和这个有关系,传输内容是base64编码的字符,当然也就不可能有中文
再次,服务器太多总不能一个个去更改apahce的配置,何况也没有权限去更改配置。
这个帖子只是为了讨论下:什么情况下会出现$_GET[]得到的变量并没有经过url解码。谢谢。
base64我记得是[a-z],[A-Z],[0-9] [+ / =],就这么些个字符,到底哪些字符会给解码了?
毕竟默认的配置肯定要解码才传给php的。
而你说到的问题可能自己编写函数解决,这也是三四楼所说的答案,对于你存在的问题下面是官方的解决方法, function url_encode($string){
return urlencode(utf8_encode($string));
}
function url_decode($string){
return utf8_decode(urldecode($string));
}