URLs für Webproxy umschreiben

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Armageddon
User
Beiträge: 7
Registriert: Dienstag 16. März 2010, 15:09
Wohnort: Ruhla

Hallo!

Ich bin gerade dabei, einen Webproxy zu schreiben, also so etwas wie auf http://mirrorrr.appspot.com/
Alles andere habe ich neu geschrieben, nur das Modul um die ganzen Adressen umzuschreiben habe ich übernommen
(Es ist einfach sehr gut, weil es z.B. auch urls in css und so findet und ersetzt)

Mein Problem ist aber, dass die URL offensichtlich in der Adresszeile zu finden ist, sodass der Traffic leicht erkannt wird. Das hat dann eine Sperrung der Seite mit Filterlisten zur Folge und macht sie wertlos. Startseite habe ich neu geschrieben und dort auch die Proxyfunktion etwas versteckt, aber die URL zu verschlüsseln macht Probleme. Ich brauche auch keinen knacht-das-FBI-in-was-weis-ich-wie-vielen-Jahren-nicht-Algorythmus, ich hab einfach ein Caesar-chiffre verwendet, es soll halt nur nicht so offensichtlich sein, was da gerade passiert.

Mein Problem ist aber: Dadurch, dass mehrere reguläre Ausdrücke verwendet werden, werden einige Teile der URL (Vor dem ersten /) mehrfach verschlüsslt, andere nur einmal (nach dem ersten /).

Code: Alles auswählen

REP = list(string.digits+ string.letters)

## Die ganzen regulären Ausdrücke!

def crypt(url, mode):
    ret = []
    if mode: fac = 1
    else: fac = -1
    for ch in url:
        if ch in REP:
            i1 = REP.index(ch)
            i1 = (i1+42*fac)%len(REP)
            ret.append(REP[i1])
        else:
            ret.append(ch)
    return "".join(ret)

class Replacer(object):
    def __init__(self,r):
        self.r = r
    def __call__(self,match):
        url = match.groupdict()["url"]
        ret = match.expand(self.r)
        return ret.replace(url,crypt(url,True))

def TransformContent(base_url, accessed_url, content):
    url_obj = urlparse.urlparse(accessed_url)
    accessed_dir = os.path.dirname(url_obj.path)
    if not accessed_dir.endswith("/"):
        accessed_dir += "/"
    for pattern, replacement in REPLACEMENT_REGEXES:
        fixed_replacement = replacement % {
          "base": base_url,
          "accessed_dir": accessed_dir,
        }
        content = re.sub(pattern, Replacer(fixed_replacement), content)
    return content
Wenn ihr aber sagt, ich verwende besser ein ganz anderes Modul, ok.. Es muss nur auf Appengine lauffähig sein!

Den gesamten Quelltext der Originalmoduls findet ihr auf http://code.google.com/p/mirrorrr/sourc ... content.py

Danke!
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ich habe mir den Code jetzt nicht genauer angesehen. Da du aber einfach nur grundsätzlich den Text etwas verschleiern möchtest könntest du als Alternative einfach Base64 verwenden. Das Modul existiert und funktioniert.
Armageddon
User
Beiträge: 7
Registriert: Dienstag 16. März 2010, 15:09
Wohnort: Ruhla

Hab ich auch schon drüber nachgedacht, ist aber nicht die Lösung meines Problems.

Das Problem ist, dass einige Links 2 mal erkannt werden und dann Probleme machen, da sie ja auch 2 mal verschlüsselt wurden sind - egal in welchem verfahren.
BlackJack

@Armageddon: Du hast halt das wichtigste weg gelassen. Die regulären Ausdrücke zum erkennen von URLs sind halt fehlerhaft wenn sie nicht eindeutig sind. Reparier das und dann werden auch keine Links mehrfach verschlüsselt. :-)
Antworten