Seite 1 von 1

UnicodeDecodeError: 'ascii' codec can't decode byte

Verfasst: Donnerstag 1. Mai 2008, 20:42
von nemomuk
Hallo,

ich versuche gerade per HTML etwas in eine Datenbank zu schreiben, bekomme aber leider immer eiunen Fehler sobald es sich um spezielle Sonderzeichen handelt. Ich komme leider nicht drauf (auch durch längeres suchen), wie ich dieses Problem lösen kann...

Code: Alles auswählen

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 202: ordinal not in range(128)
Irgendwie muss ich es decode() [n], nur wie weiß ich nicht...

Meine HTML Datei ist in UTF-8 und auch so gekennzeichnet, auch die PHP-Datei ist in UTF-8...

Weiß jemand, wie ich das beheben kann oder hat jemand einen Tip?

Vielen Dank!
MfG

Verfasst: Donnerstag 1. Mai 2008, 20:46
von birkenfeld
Zeig uns doch mal den Code, mit dem du schreibst, dann können wir dir sagen, wo die Kodierung sinnvoll ist. Was heißt "per HTML in die Datenbank"?

Allgemein: Du übergibst Bytestrings, der DB-Adapter erwartet aber wohl Unicodestrings. Irgendwo muss also ein explizites .decode('utf-8') hinein, damit der DB-Adapter nicht implizit mit ASCII dekodiert.

Verfasst: Donnerstag 1. Mai 2008, 20:52
von nemomuk

Code: Alles auswählen

for one in range(0,5):
            monat = form.getvalue("monat_neu_" + str(one),"")
            jahr = form.getvalue("jahr_neu_" + str(one),"")
            kategorie = form.getvalue("kategorie_neu_" + str(one),"")
            wo = form.getvalue("wo_neu_" + str(one),"")
            was= form.getvalue("was_neu_" + str(one),"")
            preis = form.getvalue("preis_neu_" + str(one),"")
            
            if (wo != "" or was != "") and preis != "":
                query = connection.cursor()
                query.execute("""
    						INSERT INTO 
    							kurt_daten(
    								monat,
    								jahr,
    								preis,
    								wo,
    								was,
    								kategorie) 
    							VALUES('%s','%s','%s','%s','%s','%s')"""
                                %(monat,jahr,preis,wo,was,kategorie)
                            )
Das ganze soll jedes Mal 5 Einträge aus einem HTML-Formular speichern (habe es leider schlecht ausgedrückt mit "per HTML"^^)

Danke!

Verfasst: Donnerstag 1. Mai 2008, 20:55
von birkenfeld
Erstmal solltest du die Werte nicht selbst in den Query-String einfügen, sondern das dem DB-Adapter überlassen -- siehe Doku zu execute().

Ich weiß nicht, was dein "form" für ein Typ ist, aber für am sinnvollsten hielte ich es, wenn du diesem direkt beibringst, seinen Input als UTF-8 zu behandeln und Unicode zurückzugeben.

Verfasst: Donnerstag 1. Mai 2008, 21:00
von nemomuk
Und wie bringe ich es dem form bei?^^

Verfasst: Donnerstag 1. Mai 2008, 21:03
von birkenfeld
Tut mir leid, meine Kristallkugel ist gerade beim Geologen, und für so viel Tee ist es mir schon zu spät...

Verfasst: Donnerstag 1. Mai 2008, 21:30
von mitsuhiko
Sollte das eine Webanwendung sein und form ein FieldStorage, schau dich lieber nach Alternativen um. In der Low-Level Gegend wäre da Werkzeug, das intern Unicode verwendet. Damit hast du dann das Problem nicht.

Verfasst: Donnerstag 1. Mai 2008, 22:07
von lunar
Und vielleicht noch gleich ein ORM verwenden, das SQL Statement in deinem Snippet lässt mich nämlich schlimmstmögliches bezüglich der Sicherheit deiner Webanwendung vermuten...

Verfasst: Freitag 2. Mai 2008, 05:12
von nemomuk
die Sicherheit spielt hier keine Rolle, da es nur von mir benutzt wird... und in einer abgesicherten Umgebung ist...

#Nebenbei: Was lässt dich denn daran schlimmstes vermuten?

Dann werde ich mir wohl mal Werkzeug anschauen.

Danke!

Verfasst: Freitag 2. Mai 2008, 07:07
von BlackJack
Es könnte zum Beispiel jemand in eines der Felder im Formular so etwas eintragen: ``foo'; drop table kurt_daten; --``.

Aber selbst wenn niemand so böswillige Eingaben macht, kann es immer noch vorkommen, dass in den Daten Zeichen vorkommen an denen sich Deine Methode "verschluckt". Die Kategorie "Rock'n'Roll" oder der Name "O'Reilly" machen beispielsweise Ärger.

Was die Relevanz der Sicherheit angeht: Solche "privaten" Skripte werden nicht selten früher oder später doch von anderen benutzt oder dienen gar als Basis für "öffentliche" Webanwendungen. Wenn man es gleich richtig macht, fällt einem so etwas später nicht auf die Füsse.

Sind hier übrigens wirklich alle Eingaben in die Datenbank *Texte*!?

Warum heisst die Laufvariable `one`?

Verfasst: Freitag 2. Mai 2008, 16:59
von nemomuk
ja, es sind alles Texte...

x,y,z oder was anderes ist genauso sinnlos... mir ist einfach nichts besseres eingefallen...

Vielen Dank Black Jack,... ich habe gerade nach einer Anleitung für sichere Anwendung von MySQLdb gesucht und bin leider nicht fündig geworden. Hast du da vllt. was, wo es gut erklärt wird (Sprache ist egal en/de)...

Danke!

Verfasst: Freitag 2. Mai 2008, 17:07
von Leonidas
SchneiderWeisse hat geschrieben:Vielen Dank Black Jack,... ich habe gerade nach einer Anleitung für sichere Anwendung von MySQLdb gesucht und bin leider nicht fündig geworden.
[wiki]Parametrisierte SQL-Queries[/wiki]

Verfasst: Freitag 2. Mai 2008, 18:28
von keppla
SchneiderWeisse hat geschrieben:die Sicherheit spielt hier keine Rolle, da es nur von mir benutzt wird... und in einer abgesicherten Umgebung ist...
Die konstante Ignoranz was dieses Thema angeht ist doch echt krass.
Ist es denn soooo schlimm, statt

Code: Alles auswählen

c.execute("..." % (parameter1, parameter2, parameter3))
dieses zu schreiben

Code: Alles auswählen

c.execute("...", (parameter1, parameter2, parameter3))
?
Sind kommata so teuer?
Wenn du schon PHP in Python programmieren musst, und absichtlich schlechte Programme schreiben willst, dann bau doch besser woanders ein Paar Sicherheitslücken ein um dein Ziel zu erreichen, und escape hier nur für die Usability; Wenn du schon "'; drop table kunden; --" vernachlässigen willst, Ok, aber vernachlässige doch wenigstens "O'Brien" nicht als möglichen Wert.

Verfasst: Freitag 2. Mai 2008, 18:50
von nemomuk
Was soll das denn jetzt? Wer ignoriert denn die Tips? Ich habe doch deswegen noch extra nachgefragt und habe von Leonidas eine kurze, aber perfekte Antwort bekommen. Ein Python Programmierer fällt gewöhnlich nicht vom Himmel....

Vielen Dank für deinen Kommentar!

Verfasst: Montag 5. Mai 2008, 09:47
von keppla
SchneiderWeisse hat geschrieben:Was soll das denn jetzt? Wer ignoriert denn die Tips?
Sorry, hab das etwas in den falschen Hals bekommen. Es gab hier im Forum mehrfach ziemlich ähnliche Diskussionen, die alle gemeinsam hatten, dass der Fragende nach einem Hinweis "Ich brauch keine Sicherheit" sagte (was für mich ziemlich nach Ignorieren klang)
Und das ist einfach ein Gerücht, selbst wenn man sie "noch nicht" braucht: die Fortranprogrammierer früher hätten sich auch nie gedacht, dass sie mal vierstellige Jahreszahlen brauchen.
Und selbst, wenn man sie wirklich nie braucht, so schafft man schlechte Bräuche, die dank google dann verbreitet werden.

Ich wollte auch nicht darüberherziehen, dass du nicht als Programmierergott startest, es sah eben nur etwas ignorant aus (weil es eben in der doku zur db-api steht). Wie gesagt, nicht übel nehmen, bitte.