htaccess abfragen geht aber Router blockt bei neuem Passwort

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Gerhard.S
User
Beiträge: 23
Registriert: Donnerstag 26. Juni 2014, 17:12

Jetzt mal ein komisches Phänomen
ich habe eine Routine in der User und Passwort abgefragt werden über die htaccess / htpasswd um in den geschützten Bereich zu kommen und eine Datei abzufragen
funktioniert auch bei 90% (leider nur)
bei einigen Leuten sperrt der Router sämtliche Verbindung auf meinen Server IPTVxtra.net bei einem Passwortwechsel, nur ein Router Reset hilft
kennt jemand ein solches Phänomen oder ist mein Code nicht ganz richtig?

gruß Gerhard

Code: Alles auswählen

        if not user or user == "xbmcuser":
            url = std_url + "xbmc/xml_list/" + file
        else:
            url = std_url + "xbmc/xml_save/" + file
        urlsave = urllib2.HTTPPasswordMgrWithDefaultRealm()
        urlsave.add_password(None, url, user, pwd)
        authhandler = urllib2.HTTPBasicAuthHandler(urlsave)
        opener = urllib2.build_opener(authhandler)
        urllib2.install_opener(opener)
        response = urllib2.urlopen(url)
        link=response.read()
        response.close()
        return link
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Gerhard.S: Keine direkte Antwort auf deine Frage, aber das ``urllib2``-Modul hat eine äußerst bescheidene API. Oft wird als Alternative dazu das requests-Modul empfohlen, welches auch ich dir ans Herz legen möchte. Es ist zwar nicht aus der Standardbibliothek, aber es wird dich auf Dauer sicherlich glücklicher machen.

Hier übrigens ein schönes Beispiel als Vergleich zwischen ``urllib2``-Code (oben) und ``requests``-Code (unten), der im Übrigen fast das selbe wie dein Codeausschnitt macht.
Gerhard.S
User
Beiträge: 23
Registriert: Donnerstag 26. Juni 2014, 17:12

@snafu - Danke für den Tip
aber was ich nicht verstehen kann wie so ein Code den Router beeinflussen kann, schreibt der sich irgendwas in den cache bei einem Passwortwechsel
der Fehler kommt nur vor wenn Zugangsdaten gewechselt werden ansonsten nicht
Gerhard.S
User
Beiträge: 23
Registriert: Donnerstag 26. Juni 2014, 17:12

@snafukann - kann man aus dem requests Paket auch einzelne Teile (*.py) rauspicken oder muss das ganze Paket installiert werden
das obere Code ist aus einem XBMC Addon und da ist es unmöglich bei allen das Paket zu installieren
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das ``requests``-Package ist über mehrere Module verteilt aufgebaut. Du müsstest vermutlich eher den Code für die relevanten Teile nachbauen. Aber dann kann man auch gleich bei ``urllib2`` bleiben. Der Sinn von ``requests`` ist ja vor allem, den benötigten Code hinter einer schönen API zu verstecken. Es ist ja nicht so, dass das, was ``requests`` macht, allein nur mit ``requests`` möglich wäre. Das wäre ja schon rein logisch ein ziemlicher Widerspruch.

Wenn du bestimmte Dinge öfter in deinem Programm brauchst, dann kannst du die aber natürlich als Hilfsfunktionen auslagern, die du dann verwendest.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@Gerhard.S: Du kannst Pakete auch direkt in Deinen Code aufnehmen, macht requests z.B. mit urllib3.
Zum Thema: Gibt es das gleiche Problem mit einem Browser? Was sagen die Server-logs?
Gerhard.S
User
Beiträge: 23
Registriert: Donnerstag 26. Juni 2014, 17:12

@Sirius3
wird direkt im Router geblockt, mit dem Browser kommen die auch nicht mehr auf den Server
keinerlei Eintrag in den Logs vom Server
ein Ping vom PC z.B. auf die IP vom Server ist auch negativ,
was ich heute erfahren habe, mit einem Proxy geht die Verbindung wieder auf den Server
ist doch aber auch keine Lösung, das Addon über einen Proxy laufen zu lassen,
mit dem Browser kommt man dann trotzdem nicht auf die HP

ich habe jetzt schon einen Header mit eingesetzt aber ich trau mich nicht das so wieder bereitzustellen

Code: Alles auswählen

url.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3')
ich habe aber keine Ahnung was da passiert im Router
urllib3 schaue ich mir an, weiß aber auch nicht ob die dann das selbe tut
sorry was meinst du mit Pakete

gruß Gerhard
Gerhard.S
User
Beiträge: 23
Registriert: Donnerstag 26. Juni 2014, 17:12

urllib3 funktioniert prächtig, sind auch nur noch 3 Zeilen
was ich auch noch festgestellt habe, beim Mitschnitt des Aufrufs - die einzulesende Datei wurde vorher 2x aufgerufen - jetzt nur 1x
hoffentlich gehts auch bei den anderen :K

Code: Alles auswählen

        http = urllib3.PoolManager()
        headers = urllib3.util.make_headers(basic_auth= user + ':' + pwd)
        link = http.request('GET', url, headers=headers)
        return link.data
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Gerhard.S:
Ich rate Dir, die Verwendung von BasicAuth nochmal zu überdenken, wenn die Nutzernamen und Passwörter halbwegs sicher sein sollen/müssen.
Gerhard.S
User
Beiträge: 23
Registriert: Donnerstag 26. Juni 2014, 17:12

@jerch - weil alles im Klartext übermittelt wird ?
habe ich mir auch schon überlegt,
eine weitere Möglichkeit die ich mir noch überlegt habe mit basic auth oder auch nicht, eine php Abfrage ob passwort und user richtig ist (md5 verschlüsselt)

aber ich habe noch ne Frage zur urllib3:
bei einem Fehler z.B. 401 kann ich ja keine Abfrage (except urllib3.exceptions.HttpError, e:)wie bei der normalen urllib machen (except urllib2.URLError, e:), irgendwie kommt gar kein Fehler im Vergleich zur urllib
sondern ich kann vor dem übergeben des link eine Abfrage starten, dann fällt try /except weg

Code: Alles auswählen

        if link.data.find('401') > 0:
            exitcode = "1"
            xbmc.executebuiltin('XBMC.Notification(Netzwerkfehler HTTP-401 , Passwort oder User ist sehr wahrscheinlich verkehrt ,25000,'+net+')')
            sys.exit(0)
oder gibts ne andere Lösung?

gruß Gerhard
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Gerhard.S:
Zum einen wegen Klartext, desweiteren posaunt der Browser mit jeder Verbindung zu diesem Host die Credentials mit und damit er das kann, muss er Name/Passwort zumindest temporär speichern. Unter Sicherheitsaspekten betrachtet alles nicht so dolle. Ich würd da auch das Rad nicht neu erfinden, sondern einfach auf HTTPS+Sessioncookie+Passworthashing setzen.
Gerhard.S
User
Beiträge: 23
Registriert: Donnerstag 26. Juni 2014, 17:12

@jerch - ich denke darüber nach, denn ich wollte auch das sich nur jeder Benutzer einmal anmelden kann,
allerdings in einem anderen Programm, da muss ich eh mit sessions arbeiten

hier noch die Fehlerroutine die ich im Moment eingebaut habe, evtl. kanns jemand brauchen

Code: Alles auswählen

    try:
    ..........
        if link.data.find('<epg>') > 0:    # wenn xml gefunden wurde, gehts weiter an anderer Stelle
            return link.data
        elif link.data.find('401 Authorization Required') > 0:
            xbmc.executebuiltin('XBMC.Notification(Netzwerkfehler HTTP-401 , Passwort oder User ist sehr wahrscheinlich verkehrt ,25000,'+net+')')
            sys.exit(0)
        elif link.data.find('404 Not Found') > 0:
            xbmc.executebuiltin('XBMC.Notification(Netzwerkfehler HTTP-404 , IPTVxtra.net Server nicht gefunden ,25000,'+net+')')
            sys.exit(0)
        elif link.data.find('403 Forbidden') > 0:
            xbmc.executebuiltin('XBMC.Notification(Netzwerkfehler HTTP-403 , Verbotener Zugriff auf IPTVxtra.net ,25000,'+net+')')
            sys.exit(0)
        elif link.data.find('Internal Server Error') > 0:
            xbmc.executebuiltin('XBMC.Notification(Netzwerkfehler HTTP-500 , Interner Server-Fehler bei IPTVxtra.net ,25000,'+net+')')
            sys.exit(0)
        else:
            xbmc.executebuiltin('XBMC.Notification(allgemeiner Netzwerkfehler , pruefe dein Netzwerk oder die Routerkonfiguration,25000,'+net+')')
            sys.exit(0)

    except urllib3.exceptions.MaxRetryError, e:
            xbmc.executebuiltin('XBMC.Notification(allgemeiner Netzwerkfehler , pruefe dein Netzwerk oder die Routerkonfiguration,25000,'+net+')')
            sys.exit(0)
BlackJack

@Gerhard.S: Das sieht etwas unschön aus mit den ganzen Wiederholungen. Enthaltensein einer Zeichenkette ist deutlicher mit ``if a in b`` statt ``if b.find(a) > 0``.

Allerdings würde ich da nicht im Text nach den Fehlern suchen, denn der Fehlercode wird ja vom Webserver auch im Header übertragen. Das ist sicherer und der vorgesehene Ort diese Information abzufragen.

Die ganzen Wiederholungen kann man durch ein Wörterbuch das HTTP-Fehlernummern auf Antworten abbildet vermeiden.

Ein Rückgabewert von 0 bei Prozessen ist eigentlich die übliche Konvention wenn alles glatt gelaufen ist. Wenn ein Programm aufgrund eines Fehlers abbricht, würde ich da einen anderen Wert zurück geben.
Gerhard.S
User
Beiträge: 23
Registriert: Donnerstag 26. Juni 2014, 17:12

@BlackJack - hast sicher Recht,
aber so funkts momentan auch und kommt nur einmal im ganzen Code vor, würde ich das ganze öfters brauchen würde ichs anders machen
habe mir aber bis zu diesem Zeitpunkt noch keine Gedanken gemacht, wollte nur darauf anstoßen das die urllib3 keine Http-Fehlermeldung wie bei urllib2 ausgiebt
z.B. bei xbmc machts nur ping und rechts unten steht Scriptfehler, und mit dem Zeugs oben zeigt es den genauen Fehler an, ist einfacher bei der Fehlerbehebung

gruß Gerhard
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Gerhard.S: Man kann das durchaus so hinklatschen, wenn es erstmal funktionieren soll. Sofern du aber nicht unter Zeitdruck stehst, solltest du das früher oder später nochmal überarbeiten entsprechend der Hinweise, die BlackJack gegeben hat. Die Entscheidung liegt natürlich bei dir, aber es wäre sicherlich keine Zeitverschwendung, zumal man durch solche Überarbeitungen auch grundsätzlich die eigenen Fähigkeiten beim Coden verbessert.
Gerhard.S
User
Beiträge: 23
Registriert: Donnerstag 26. Juni 2014, 17:12

noch mal zum Schluss:
Ich habe jetzt das requests-Paket eingebaut, da ist alles drin was das URL Herz begehrt und auch noch wesentlich einfacher zu coden.
dann habe ich mir auch die Kritik von meinem Code zu Herzen genommen und habe alles ausgebessert / umgeschrieben

jetzt läuft auch alles so wie ich es mir vorgestellt habe, logge mich nicht mehr über die .htaccess ein sondern über ein PHP Script
im Moment noch ohne sessions aber das kommt noch, da ich nur eine Anmeldung pro User und Sitzung zulassen möchte.

gruß Gerhard
und nochmal Danke für eure Tips und Hilfe
Antworten