Der urlencodierte Schrägstrich unterbricht die URL

70

Über das System

Ich habe URLs dieses Formats in meinem Projekt: -

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

Wobei Schlüsselwort / Klassenpaar die Suche mit dem Schlüsselwort "Klasse" bedeutet.

Ich habe eine gemeinsame index.php-Datei, die für jedes Modul im Projekt ausgeführt wird. Es gibt nur eine Umschreiberegel, um die index.php von der URL zu entfernen: -

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

Ich verwende urlencode () beim Vorbereiten der Such-URL und urldecode () beim Lesen der Such-URL.

Problem

Nur das Schrägstrichzeichen unterbricht URLs, wodurch ein Fehler bei 404 Seiten nicht gefunden wird. Zum Beispiel, wenn ich suche, ist one/twodie URL

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

Wie behebe ich das? Ich muss index.php in der URL versteckt halten. Wenn dies nicht erforderlich gewesen wäre, hätte es kein Problem mit dem Schrägstrich gegeben, und ich hätte diese URL verwenden können: -

http://project_name/index.php?browse_by_exam/type/tutor_search/keyword/one
%2Ftwo/new_search/1/search_exam/0/search_subject/0
Sandeepan Nath
quelle
1
Ich halte es für das Beste, URLs wie diese zu haben: - Auf http://project_name/browse_by_exam?type/tutor_search/keyword/class %2Fnew/new_search/1/search_exam/0/search_subject/0 diese Weise werde ich die Lesbarkeitsschwierigkeiten beseitigen, die durch die Konvention & param1 = value1 & param2 = value2 verursacht werden, und ich kann auch Schrägstriche zulassen (jetzt im Teil der Abfragezeichenfolge mit ?) I. würde AllowEncodedSlashes vermeiden, weil Bobince sagte, Also some tools or spiders might get confused by it. Although %2F to mean / in a path part is correct as per the standard, most of the web avoids it. URL .htaccess URL-Routing
Sandeepan Nath
1
Sie können% 2F verwenden, wenn Sie diese Methode verwenden? param1 = Wert1 & param2 = Wert% 2FWert, aber wenn Sie / param1 = Wert1 / param2 = Wert% 2FWert verwenden, wird ein Fehler ausgegeben.
Ahmad

Antworten:

145

Apache lehnt %2Faus Sicherheitsgründen alle URLs im Pfad ab: Skripte können normalerweise nicht (dh ohne Umschreiben) den Unterschied zwischen %2Fund /aufgrund der PATH_INFOautomatischen URL-Dekodierung der Umgebungsvariablen erkennen (was dumm, aber langjährig ist) Teil der CGI-Spezifikation, daher kann nichts dagegen unternommen werden.

Sie können diese Funktion mithilfe der AllowEncodedSlashesDirektive deaktivieren. Beachten Sie jedoch, dass andere Webserver sie weiterhin nicht zulassen (ohne die Option, sie zu deaktivieren) und dass andere Zeichen möglicherweise ebenfalls tabu sind (z. B. %5C), und dies %00insbesondere immer wird sowohl von Apache als auch von IIS blockiert. Wenn sich Ihre Anwendung darauf verlassen %2Fwürde, dass ein Pfadteil andere Zeichen enthalten könnte, würden Sie Ihre Kompatibilitäts- / Bereitstellungsoptionen einschränken.

Ich verwende urlencode (), während ich die Such-URL vorbereite

Sie sollten verwenden rawurlencode(), nicht urlencode()zum Entkommen von Pfadteilen. urlencode()ist falsch benannt, gilt dies tatsächlich für application/x-www-form-urlencodedDaten wie in der Abfragezeichenfolge oder im Hauptteil einer POST-Anforderung und nicht für andere Teile der URL.

Der Unterschied besteht darin, dass in +Pfadteilen kein Platz vorhanden ist. rawurlencode()wird %20stattdessen korrekt erzeugt , was sowohl in formularcodierten Daten als auch in anderen Teilen der URL funktioniert.

Bobince
quelle
4
Ah, deshalb wird der Schrägstrich abgelehnt. Perfekte Diagnose und Behandlung.
Pekka
1
+1 Ich habe versucht, einige davon in einer seiner anderen Fragen zu erklären, aber Sie haben es weitaus kohärenter gemacht, als ich es konnte.
Tim Stone
6
Hallo Bobince, rawurlencode()konvertiert auch Schrägstriche, %2Fdie meine URL immer noch beschädigen . Ich habe eigentlich nicht verstanden, wie rawurlencode()ich mein Problem beheben kann.
Sandeepan Nath
2
Es ist kein Nebenproblem, das mit +vs. zu tun hat %20. Das Update ist AllowEncodedSlashes, obwohl das Verlassen darauf Ihre Bereitstellungsmöglichkeiten verringert (dh Sie können es nicht auf IIS bereitstellen, und andere Benutzer - falls vorhanden - können es nicht bereitstellen, wenn sie Shared Hosting ohne Zugriff verwenden zum httpd.conf). Auch einige Werkzeuge oder Spinnen könnten dadurch verwirrt werden. Obwohl %2Fes /gemäß dem Standard korrekt ist , in einem Pfad zu bedeuten, wird dies im größten Teil des Webs vermieden.
Bobince
1
Ja, jede Folge von codierten Bytes muss in der Abfragezeichenfolge zulässig sein. Während jedes codierte Byte in einer Pfadkomponente gemäß URL-RFC technisch gültig ist, haben Server Probleme mit einigen von ihnen, da der Pfadteil traditionell für Dateinamen verwendet wird. Abgesehen von %00, %2Fund %5Cwird IIS auch Probleme geben Sie mit Nicht-ASCII - Byte - Sequenzen in dem Pfad, der nicht gültig UTF-8 - Sequenzen sind.
Bobince
9

Ersetzen Sie% 2F nach der URL-Codierung durch% 252F

PHP

function custom_http_build_query($query=array()){

    return str_replace('%2F','%252F', http_build_query($query));
}

Behandeln Sie die Anfrage über htaccess

.htaccess

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

Ressourcen

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

RafaSashi
quelle
Vielen Dank, mein Problem war keine NE-Flagge.
EmRa228
4

In Apache würde AllowEncodedSlashes On verhindern, dass die Anforderung sofort mit einem 404 abgelehnt wird.

Nur eine weitere Idee, wie dies behoben werden kann.

Paul Jennings
quelle
4
$encoded_url = str_replace('%2F', '/', urlencode($url));
CpnCrunch
quelle
4

Ich hatte das gleiche Problem mit Schrägstrich in URL get param, in meinem Fall funktioniert folgender PHP-Code:

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

Ich ersetze zuerst den Schrägstrich durch eine HTML-Entität und mache dann die URL-Codierung.

Christian Michael
quelle
2

Auf meinem Hosting-Konto wurde dieses Problem durch eine ModSecurity-Regel verursacht, die automatisch für alle Konten festgelegt wurde. Nachdem ich dieses Problem gemeldet habe, hat der Administrator diese Regel für mein Konto schnell entfernt.

römisch
quelle
1

Verwenden Sie ein anderes Zeichen und ersetzen Sie die Schrägstriche auf der Serverseite

Beispiel: Drupal.org verwendet% 21 (das Ausrufezeichen!), um den Schrägstrich in einem URL-Parameter darzustellen.

Beide Links funktionieren:

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

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

Wenn Sie befürchten, dass das Zeichen mit einem Zeichen im Parameter kollidiert, verwenden Sie eine Zeichenkombination.

Ihre URL wäre also http: // Projektname / browse_by_exam / type / tutor_search / keyword / one_-! Two / new_search / 1 / search_exam / 0 / search_subject / 0

Ändern Sie es mit js und konvertieren Sie es zurück in einen Slash-Server.

chim
quelle
1

Hier ist meine bescheidene Meinung. !!!! Nicht !!!! Ändern Sie die Einstellungen auf dem Server, damit Ihre Parameter ordnungsgemäß funktionieren. Dies ist eine Zeitbombe, die darauf wartet, eines Tages passiert zu werden, wenn Sie den Server wechseln.

Der beste Weg, den ich gefunden habe, besteht darin, den Parameter einfach in die Basis-64-Codierung zu konvertieren. In meinem Fall rufe ich einen PHP-Dienst von Angular auf und übergebe einen Parameter, der einen beliebigen Wert enthalten kann.

Mein Typoskript-Code im Client sieht also folgendermaßen aus:

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

Und um den Parameter in PHP abzurufen:

    $item_name = $request->getAttribute('item_name');
    $item_name = base64_decode($item_name); 
Jon Vote
quelle
0

Eine Standardlösung für dieses Problem besteht darin, Schrägstriche zuzulassen, indem der Parameter, der Schrägstriche enthalten kann, zum letzten Parameter in der URL gemacht wird.

Für eine Produktcode-URL hätten Sie dann ...

mysite.com/product/details/PR12345/22

Für einen Suchbegriff hätten Sie

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

(Das Schlüsselwort hier ist Psychologie / Management)

Es ist kein großer Arbeitsaufwand, die ersten "benannten" Parameter zu verarbeiten und die verbleibenden als Produktcode oder Schlüsselwort zu betrachten.

Einige Frameworks haben diese Funktion in ihre Routing-Definitionen integriert.

Dies gilt nicht für Anwendungsfälle mit zwei Parametern, die Schrägstriche enthalten.

chim
quelle
0

ist einfach für mich benutze base64_encode

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

nachdem Sie den Begriff entschlüsselt haben

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

auf diese Weise codieren Sie die "/" und "\"

Yannick William Nchoutmboube
quelle
-1

Ich verwende die Javascript-Funktion encodeURI () für den URL-Teil, der Schrägstriche enthält, die als Zeichen anstelle der http-Adresse angezeigt werden sollten. Z.B:

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

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

Eva M.
quelle
Das Problem ist die Behandlung des URI, nachdem er in% 2F codiert wurde - siehe akzeptierte AntwortApache denies all URLs with %2F in the path part
Jordanien
-1

Ich habe dies gelöst, indem ich 2 benutzerdefinierte Funktionen wie folgt verwendet habe:

function slash_replace($query){

    return str_replace('/','_', $query);
}

function slash_unreplace($query){

    return str_replace('_','/', $query);
}

Zum Codieren könnte ich also anrufen:

rawurlencode(slash_replace($param))

und zum dekodieren konnte ich anrufen

slash_unreplace(rawurldecode($param);

Prost!

Exzellenz Ilesanmi
quelle
-3

Sie können %2FFolgendes verwenden:
?param1=value1&param2=value%2Fvalue

aber wenn Sie es verwenden /param1=value1/param2=value%2Fvalue, wird ein Fehler ausgelöst.

Ahmad
quelle