wake-up-neo.com

Wie finde ich heraus, ob die Zeichenfolge bereits URL-kodiert wurde?

Wie kann ich überprüfen, ob die Zeichenfolge bereits verschlüsselt wurde? 

Wenn ich beispielsweise TEST== codiere, erhalte ich TEST%3D%3D. Wenn ich die letzte Zeichenfolge erneut codiere, bekomme ich TEST%253D%253D, ich müsste vorher wissen, ob sie bereits codiert ist ...

Ich habe verschlüsselte Parameter gespeichert und muss danach suchen. Ich weiß nicht für Eingabeparameter, was sie codiert werden sollen oder nicht, daher muss ich wissen, ob ich sie vor der Suche codieren oder decodieren muss.

41
Trick

Decodieren, mit Original vergleichen. Wenn dies nicht der Fall ist, wird das Original verschlüsselt. Wenn es sich nicht unterscheidet, wird das Original nicht codiert. Es sagt jedoch nichts darüber aus, ob die neu decodierte Version nicht immer noch codiert ist. Eine gute Aufgabe für die Rekursion.

Ich hoffe, man kann keine Keile in Urlencode schreiben, oder dieser Algorithmus würde stecken bleiben.

36
SF.

Verwenden Sie den regulären Ausdruck, um zu prüfen, ob Ihre Zeichenfolge unzulässige Zeichen enthält (z. B. Zeichen, die in einer URL-kodierten Zeichenfolge nicht enthalten sind, wie z. B. Leerzeichen).

14
Roman

Joel auf Software hatte eine Lösung dafür irgendwann zurück - http://www.joelonsoftware.com/articles/Wrong.html
Oder Sie können den Strings ein Präfix hinzufügen.

4
Padmarag

Sie können es nicht genau wissen, es sei denn, Ihre Saiten entsprechen einem bestimmten Muster oder Sie verfolgen Ihre Saiten. Wie Sie selbst festgestellt haben, kann ein String, der codiert ist, auch codiert werden. Sie können also nicht 100% ig sicher sein, wenn Sie den String selbst betrachten.

3
flybywire

Versuchen Sie die URL zu dekodieren. Wenn die resultierende Zeichenfolge kürzer als die ursprüngliche ist, wurde die ursprüngliche URL bereits codiert. Andernfalls können Sie sie sicher codieren (entweder wird sie nicht codiert oder die URL bleibt sogar nach der Codierung erhalten; eine erneute Codierung führt nicht zu einer falschen URL ). Nachfolgend finden Sie einen Pseudo-Code (inspiriert von Ruby):

# Returns encoded URL for any given URL after determining whether it is already encoded or not
    def escape(url)
      unescaped_url = URI.unescape(url)
      if (unescaped_url.length < url.length)
        return url
      else
        return URI.escape(url)
      end
    end
3
amit_saxena

Überprüfen Sie Ihre URL auf verdächtige Zeichen [1]. Kandidatenliste:

WHITE_SPACE ,", < , > , { , } , | , \ , ^ , ~ , [ , ] , . und ` 

Ich benutze:

private static boolean isAlreadyEncoded(String passedUrl) {
        boolean isEncoded = true;
        if (passedUrl.matches(".*[\\ \"\\<\\>\\{\\}|\\\\^~\\[\\]].*")) {
                isEncoded = false;
        }
        return isEncoded;
}

Für die eigentliche Kodierung gehe ich mit:

https://stackoverflow.com/a/49796882/1485527

Note: Auch wenn Ihre URL keine unsicheren Zeichen enthält, möchten Sie sie möglicherweise anwenden. Punnycode-Kodierung für den Hostnamen. So bleibt noch viel Platz für zusätzliche Kontrollen.


[1] Eine Liste der Kandidaten finden Sie im Abschnitt "unsicher" der URL spec at Seite 2 . Nach meinem Verständnis sollte "%" oder "#" bei der Verschlüsselungsprüfung weggelassen werden da diese Zeichen auch in verschlüsselten URLs vorkommen können.

0
jschnasse

Gemäß der Spezifikation ( https://tools.ietf.org/html/rfc3986 ) müssen alle URLs [~ # ~] [~ # ~] Beginnen Sie mit einem Schema, gefolgt von einem:

Da Doppelpunkte als Trennzeichen zwischen einem Schema und dem Rest des URI erforderlich sind, wird keine Zeichenfolge codiert, die einen Doppelpunkt enthält.

(Dies setzt voraus, dass Sie keine unvollständige URI ohne Schema erhalten.)

Sie können also testen, ob die Zeichenfolge einen Doppelpunkt enthält. Wenn dies nicht der Fall ist, urldecodieren Sie sie. Wenn diese Zeichenfolge einen Doppelpunkt enthält, wurde die ursprüngliche Zeichenfolge url-codiert. Wenn dies nicht der Fall ist, überprüfen Sie, ob die Zeichenfolgen unterschiedlich sind ist keine gültige URI.

Sie können diese Schleife vereinfachen, wenn Sie wissen, mit welchen Schemata Sie rechnen können.

0
Luke Mlsna

Wenn Sie sicher sein wollen, dass der String korrekt codiert ist (wenn er codiert werden muss), müssen Sie ihn einfach erneut codieren und codieren.

metacode:

100%_correctly_encoded_string = encode(decode(input_string))

bereits verschlüsselte Zeichenfolge bleibt unberührt. Nicht kodierte Zeichenfolge wird kodiert. Zeichenfolgen mit nur URL-erlaubten Zeichen bleiben ebenfalls unberührt.

0
esergion