$_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都是自动转的。 

解决方案 »

  1.   

    urldecode是比较危险的,要慎用,或者不用,用base64encode或者自己写个加密函数都好。
    假设用户在浏览器地址栏上输入%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;
      

  2.   


    不存在这种情况,url解码完成于web服务器,而不是php
      

  3.   


    不明白你说的意思。
    $_GET[]得到变量的URL解码过程是哪个解决的?现在遇到的是服务器$_GET[]得到的变量不自动解码,我想查出来具体是什么原因引起的。
      

  4.   

    $_GET[]得到变量的URL解码过程是哪个解决的?
    =======================================浏览器会自动解码#3楼的例子
    %2527输入到浏览器地址栏,%25会被浏览器decode成%字符,%2527从被php接收时就变成了%27,这时候再使用上php的urldecode,%27就变成了'号,从而实现注入。
      

  5.   

    你在浏览器中输入%(ascii16进制符)以及&gt,&lt等都会被浏览器解码的
      

  6.   

    怎么感觉各位所答非所问什么情况下会出现使用$_GET[]获取变量,不会自动url解码?这才是我所问的问题。浏览器的URL中有%2527,但是$_GET[]到的依然是%2527,而不是解码的%27
      

  7.   

    用htmlspecialchars对get的值进行处理也不行吗
      

  8.   

    什么情况下会出现使用$_GET[]获取变量,不会自动url解码?
    ============================================================================================
    你这问题古灵精怪。php是部署在web server端的,url解码是被浏览器处理的,那你就看看浏览器有没有此类配置咯。。
      

  9.   


    你的回答都很有问题,这是PHP版块,不是JS版块我当然问的是PHP的url解码
      

  10.   


    不是变通的解决问题,我是查找引起那种情况的原因是什么。我现在是base64编码的数据,里面会有一些特殊符号被url编码了,那么用$_GET获取的时候本应该自动url解码,那样base64解码才正确,但现在是有一小部分服务器不自动url解码,所以base64解码出来的就不对。我想查出是什么原因,写统一的代码,避免出现程序执行过程中的错误。
      

  11.   

    呵呵。
    应该是url解一次码(%16进制),web server再解一次html实体码(类似&lt,&gt等)
    你php就是接收web server给你的解过码的query string,你反而要用php去获取未解码的东西。除非反着转回去。
      

  12.   

    请仔细看清楚了,是php获取到的是未解码的东西,我想知道是什么原因引起的,谢谢!
      

  13.   

    那也不可能是php的配置能控制的了的,应该是apache的配置。
    或者你把url是怎么样的发出来看看,有无中文,apache的AddDefaultCharset的配置是什么值都说清楚点
      

  14.   


    首先,我没说一定跟php.ini有关,我写明只是网上搜索出来的东西
    其次,AddDefaultCharset我不认为和这个有关系,传输内容是base64编码的字符,当然也就不可能有中文
    再次,服务器太多总不能一个个去更改apahce的配置,何况也没有权限去更改配置。
    这个帖子只是为了讨论下:什么情况下会出现$_GET[]得到的变量并没有经过url解码。谢谢。
      

  15.   

    你的base64编码字符串怎么会有什么特殊符号呀?
    base64我记得是[a-z],[A-Z],[0-9] [+ / =],就这么些个字符,到底哪些字符会给解码了?
      

  16.   

    而且我觉得$_GET想要原始的url,可能必须根据原始未解码的$_SERVER['QUERY_STRING']去重新赋值一遍。
    毕竟默认的配置肯定要解码才传给php的。
      

  17.   

    客户请求-->WEB服务器-->PHP执行在第二步时已经实现了自动url解码,所以你在PHP无论怎么处理都是无用功,
    而你说到的问题可能自己编写函数解决,这也是三四楼所说的答案,对于你存在的问题下面是官方的解决方法,    function url_encode($string){
            return urlencode(utf8_encode($string));
        }
        
        function url_decode($string){
            return utf8_decode(urldecode($string));
        }