代码之家  ›  专栏  ›  技术社区  ›  Sandeepan Nath

urlencoded正斜杠正在打断URL

  •  68
  • Sandeepan Nath  · 技术社区  · 15 年前

    关于系统

    我的邮箱中有这种格式的URLproject:-

    http://project_name/browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0
    

    其中keyword/class对表示使用“class”关键字进行搜索。

    我有一个common index.php文件,它对项目中的每个模块都执行。只有重写规则可以从URL中删除index.php:-

    RewriteCond $1 !^(index\.php|resources|robots\.txt)
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php [L,QSA]
    

    只有正斜杠字符正在打断URL,导致404页未找到错误。 例如,如果我搜索 one/two URL为

    http://project_name/browse_by_exam/type/tutor_search/keyword/one%2Ftwo/new_search/1/search_exam/0/search_subject/0/page_sort/
    

    http://project_name/index.php?browse_by_exam/type/tutor_search/keyword/one
    %2Ftwo/new_search/1/search_exam/0/search_subject/0
    
    12 回复  |  直到 8 年前
        1
  •  146
  •   bobince    15 年前

    %2F 在路径部分,出于安全原因:脚本通常无法(即不重写)区分 / PATH_INFO 自动对环境变量进行URL解码(这很愚蠢,但这是CGI规范的一个长期存在的部分,因此对此无能为力)。

    您可以使用 AllowEncodedSlashes %5C %00 %二楼 或者路径部分中的其他字符会限制兼容性/部署选项。

    我在准备搜索URL时使用urlencode()

    rawurlencode() ,不是 urlencode() 用于转义路径部分。 名字错了,其实是为了 application/x-www-form-urlencoded

    不同的是 + 并不意味着路径部分有空间。 rawurlencode() %20

        2
  •  10
  •   RafaSashi    10 年前

    function custom_http_build_query($query=array()){
    
        return str_replace('%2F','%252F', http_build_query($query));
    }
    

    通过htaccess处理请求

    RewriteCond %{REQUEST_URI} ^(.*?)(%252F)(.*?)$ [NC]
    RewriteRule . %1/%3 [R=301,L,NE]
    

    资源

    http://www.leakon.com/archives/865

        3
  •  4
  •   Paul Jennings    14 年前

    在Apache中,allowEncodedsLashOn可以防止请求立即被404拒绝。

        4
  •  4
  •   MrWhite    9 年前
    $encoded_url = str_replace('%2F', '/', urlencode($url));
    
        5
  •  4
  •   Christian Michael    9 年前

    $value = "hello/world"
    $value = str_replace('/', '/', $value;?>
    $value = urlencode($value);?>
    # $value is now hello%26%2347%3Bworld
    

    我首先用html实体替换斜杠,然后进行url编码。

        6
  •  2
  •   Roman    14 年前

    在我的主机帐户上,这个问题是由ModSecurity规则引起的,该规则是为所有帐户自动设置的。当我报告这个问题时,他们的管理员很快删除了我帐户的这个规则。

        7
  •  2
  •   Jon Vote    6 年前

    这是我的拙见!!!!不要!!!!更改服务器上的设置以使参数正常工作。这是一颗定时炸弹,当你更换服务器的时候,它随时可能发生。

    我找到的最好的方法就是将参数转换为base64编码。所以在我的例子中,我从Angular调用一个php服务,并传递一个可以包含任何值的参数。

    所以我在客户端的typescript代码如下所示:

        private encodeParameter(parm:string){
        if (!parm){
            return null;
        }
        return btoa(parm);
    }
    

    在php中检索参数:

        $item_name = $request->getAttribute('item_name');
        $item_name = base64_decode($item_name); 
    
        8
  •  1
  •   chim    9 年前

    使用其他字符并替换服务器端的斜杠

    e、 g.Drupal.org使用%21(excalation标记字符!)表示url参数中的斜杠。

    以下两个链接都起作用:

    https://api.drupal.org/api/drupal/includes%21common.inc/7

    https://api.drupal.org/api/drupal/includes!common.inc/7

    如果担心字符可能与参数中的字符冲突,请使用字符组合。

    所以你的网址是 http://project_name/browse_by_exam/type/tutor_search/keyword/one_-!two/new_search/1/search_exam/0/search_subject/0

        9
  •  1
  •   Yannick William Nchoutmboube    8 年前

    对我来说使用base64\u编码很简单

    $term = base64_encode($term) 
    $url = $youurl.'?term='.$term
    

    在你破解这个词之后

    $term = base64_decode($['GET']['term'])
    

    这样编码“/”和“\”

        10
  •  0
  •   chim    10 年前

    此问题的标准解决方案是允许使用斜杠,方法是将可能包含斜杠的参数设置为url中的最后一个参数。

    对于产品代码url,您将拥有。。。

    mysite.com/product/details/PR12345/22
    

    找一个搜索词

    http://project/search_exam/0/search_subject/0/keyword/Psychology/Management
    

    处理第一个“命名的”参数,然后将其余的参数转换为产品代码或关键字,这并不是一个很大的工作量。

    一些框架在其路由定义中内置了此功能。

    这不适用于涉及包含斜杠的两个参数的用例。

        11
  •  -1
  •   Eva M    10 年前

    我对URL部分使用javascript encodeURI()函数,该部分的前斜杠应被视为字符,而不是http地址。 如:

    "/api/activites/" + encodeURI("?categorie=assemblage&nom=Manipulation/Finition")
    

    http://www.w3schools.com/tags/ref_urlencode.asp

        12
  •  -1
  •   Excellence Ilesanmi    8 年前

    我通过使用如下2个自定义函数解决了这个问题:

    function slash_replace($query){
    
        return str_replace('/','_', $query);
    }
    
    function slash_unreplace($query){
    
        return str_replace('_','/', $query);
    }
    

    rawurlencode(slash_replace($param))
    

    为了解码我可以打电话

    slash_unreplace(rawurldecode($param);
    

        13
  •  -3
  •   MrWhite    9 年前

    %2F 如果这样使用:
    ?param1=value1&param2=value%2Fvalue

    /param1=value1/param2=value%2Fvalue 它将抛出一个错误。