Zurück   klamm-Forum > Virtual World > Programmierung

Antwort
 
Themen-Optionen Ansicht
Alt 15.11.2006, 11:31:42   #1 (permalink)
DadyCool
Erfahrener Benutzer

ID: 81813
Lose senden

Reg: 30.04.2006
Beiträge: 601
Standard [PHP] Richtig Escapen?

Hi,

ich kenne mich mit PHP-Sicherheit leider nicht so aus. Habe gelesen, dass man die Daten aber immer erst Escapen soll bevor diese in der DB geschrieben werden.

Meine Funktion:
PHP-Code:
1:
2:
3:
4:
5:
$str trim($str); // Leerzeichen am ende und anfang weg machen
$str preg_replace('/\S{60}/''\0 '$str);   // Nach 60 Zeichen kommt ein umbruch
$str htmlentities($str); // HTML umwandeln
$str addslashes($str); // Zeichen maskieren
$str nl2br($str); // umbruch zu <br /> machen 
dann stehen die Daten maskiert in der DB. Wie sollte ich die denn aber wieder auslesen?

DadyCool
 
DadyCool ist offline   Mit Zitat antworten
Alt 15.11.2006, 11:52:28   #2 (permalink)
SebastianWe
Neuer Benutzer

ID: 98689
Lose senden

SebastianWe eine Nachricht über ICQ schicken SebastianWe eine Nachricht über AIM schicken SebastianWe eine Nachricht über MSN schicken
Reg: 26.10.2006
Beiträge: 10
Standard

http://php.net/stripslashes
 
SebastianWe ist offline   Mit Zitat antworten
Alt 15.11.2006, 12:06:33   #3 (permalink)
DadyCool
Erfahrener Benutzer

ID: 81813
Lose senden

Reg: 30.04.2006
Beiträge: 601
Standard

habe mich etwas ungeschickt ausgedrückt...

Ich habe einfach nen Denkfehler....

Also erst maskiere ich die Zeichen, damit diese sicher in der DB stehen und anschließend wandle ich sie wieder zurück damit diese richtig auf der HP angezeigt werden.

Aber ist das nicht das gleiche, als würde ich sie überhaupt nicht maskieren?

DadyCool
 
DadyCool ist offline Threadstarter   Mit Zitat antworten
Alt 15.11.2006, 12:14:42   #4 (permalink)
SebastianWe
Neuer Benutzer

ID: 98689
Lose senden

SebastianWe eine Nachricht über ICQ schicken SebastianWe eine Nachricht über AIM schicken SebastianWe eine Nachricht über MSN schicken
Reg: 26.10.2006
Beiträge: 10
Standard

Ich vermute mal, dass der Autor des Artikels/Buches, das du gelesen hast, damit einen Schutz vor SQL-Injection erreichen möchte.
 
SebastianWe ist offline   Mit Zitat antworten
Alt 15.11.2006, 12:27:41   #5 (permalink)
DadyCool
Erfahrener Benutzer

ID: 81813
Lose senden

Reg: 30.04.2006
Beiträge: 601
Standard

Zitat:
Zitat von SebastianWe Beitrag anzeigen
Ich vermute mal, dass der Autor des Artikels/Buches, das du gelesen hast, damit einen Schutz vor SQL-Injection erreichen möchte.
ja darum geht es...


Also bei einem INTO maskiere ich die Daten. Bei einem Select entferne ich dann die Maskierung, damit die Zeichen auf der PHP Seite richtig angezeigt werden.
Habe ich damit nicht die Sicherheit wieder aufgehoben...? bin ein wenig verwirt....


DadyCool
 
DadyCool ist offline Threadstarter   Mit Zitat antworten
Alt 15.11.2006, 12:44:03   #6 (permalink)
unregiert
abgemeldet

Reg: 22.04.2006
Beiträge: 453
Standard

Das Problem ist, dass du, wenn du SQL Abfragen machst, ganz einfach auch "andere" Abfragen einfügen kannst. So kann man bei einem einfachen Login-System folgendes als Usernamen nehmen: admin , und als Passwort '.TRUE.' - Damit käme man mit jedem Passwort rein. Nun, mysql_real_escape_string schützt dich vor solchen Injektionen. Es macht allen ' ein \ vorne drann. Das blöde ist aber dann meistens, dass Volltext mit " drinnen auch \-e bekommt, so dass man sie bei der Auslese und dem Anzeigen davor noch stripslashes verwenden muss.
 
unregiert ist offline   Mit Zitat antworten
Alt 15.11.2006, 12:45:36   #7 (permalink)
SebastianWe
Neuer Benutzer

ID: 98689
Lose senden

SebastianWe eine Nachricht über ICQ schicken SebastianWe eine Nachricht über AIM schicken SebastianWe eine Nachricht über MSN schicken
Reg: 26.10.2006
Beiträge: 10
Standard

Keine Sorge. Das ist soweit korrekt. Du solltest dich ein wenig einlesen was SQL-Injection angeht, um zu verstehen wie das funktioniert und was du mit dieser Methode machst, um es zu verhindern.
Mit freundlichen Grüßen
Sebastian Weidenbach

myPowerhost - High Quality Webhosting
E-Mail: info@mypowerhost.de | Tel.: +49 6722 203423

SebastianWe ist offline   Mit Zitat antworten
Alt 15.11.2006, 12:59:41   #8 (permalink)
DadyCool
Erfahrener Benutzer

ID: 81813
Lose senden

Reg: 30.04.2006
Beiträge: 601
Standard

alles klar und erstmal danke

DadyCool
 
DadyCool ist offline Threadstarter   Mit Zitat antworten
Alt 15.11.2006, 13:10:27   #9 (permalink)
ZeroCCC
wasn das?
Benutzerbild von ZeroCCC

ID: 46810
Lose senden

ZeroCCC eine Nachricht über ICQ schicken
Reg: 10.05.2006
Beiträge: 1.734
Standard

um sql injections zu verhindern nimmt man addslashes oder noch besser eine dazu eventuell vorhande funktion. wie zb bei mysql mysql_real_escape_string... damit ist man vor sql injections sicher bzw. sicherer. mit den befehl wird der string aber nur maskiert und diese maskierung hebt sich automatisch wieder auf. sprich wenn du jetzt "hallo 'du' da" speichern willst wird der string erst maskiert "hallo \'du\' da" und diese maskierung wird beim speichern wieder entfernt. also steht dann "hallo 'du' da" in der datenbank... somit kannst du die daten ohne umstände auslesen.

das andere was du gepostet hast eigent sich nicht um vor sql injections zu schützen...
  • trim($str) = kein schutz... entfernt nur überflüssige withspaces (leerzeichen,tabs,zeilenumbrüche) am ende und am anfang vom string (was aber mysql zb bei varchar automatisch mach)
  • preg_replace('/\S{60}/', '\0 ', $str) = splittet zu lange strings... damit wird verhindert das das design explodiert wenn jemand zb sowas schreibt "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddd" (das forum hat sowas auch eingebaut)
  • htmlentities($str) = schützt vor html code... also auch vor cros site scripting.
  • nl2br($str) = für die ausgabe von text feldern in formularen wichtig... ersetzt die zeilenumbrüche gegen <br />. somit bleibt die absatz formatierung erhalten wenn man die eingabe einer <textarea> auf einer html seite darstellt.
das ganze ist eigentlich alles nötig um user eingaben auf einer website darzustellen. ansonsten könnte man am ende probleme bekommen...

die frage wo man das alles anwendet ist ne andere sache... es kann vorteile und nachteile haben die daten schon von vornherein so umgewandelt in der datenbank gespeicher zu haben oder erst bei der ausgabe umzuwandeln.
 

Geändert von ZeroCCC (15.11.2006 um 13:21:03 Uhr) Grund: sah ein bissel komisch aus
ZeroCCC ist offline   Mit Zitat antworten
Alt 15.11.2006, 13:15:40   #10 (permalink)
DadyCool
Erfahrener Benutzer

ID: 81813
Lose senden

Reg: 30.04.2006
Beiträge: 601
Standard

Zitat:
Zitat von ZeroCCC Beitrag anzeigen
um sql injections zu verhindern nimmt man addslashes oder noch eine dazu eventuell vorhande funktion. wie zb bei mysql mysql_real_escape_string... damit ist man vor sql injections sicher bzw. sicherer. mit den befehl wird der string aber nur maskiert und diese maskierung hebt sich automatisch wieder auf. sprich wenn du jetzt "hallo 'du' da" speichern willst wird der string erst maskiert "hallo \'du\' da" und diese maskierung wird beim speichern wieder entfernt. also steht dann "hallo 'du' da" in der datenbank... somit kannst du die daten ohne umstände auslesen.

das andere was du gepostet hast eigent sich nicht um vor sql injections zu schützen...
trim($str) = kein schutz... entfernt nur überflüssige withspaces (leerzeichen,tabs,zeilenumbrüche) am ende und am anfang vom string (was aber mysql zb bei varchar automatisch mach)
preg_replace('/\S{60}/', '\0 ', $str) = splittet zu lange strings... damit wird verhindert das das design explodiert wenn jemand zb sowas schreibt "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddd" (das forum hat sowas auch eingebaut)
htmlentities($str) = schützt vor html code... also auch vor cros site scripting.
nl2br($str) = für die ausgabe von text feldern in formularen wichtig... ersetzt die zeilenumbrüche gegen <br />. somit bleibt die absatz formatierung erhalten wenn man die eingabe einer <textarea> auf einer html seite darstellt.

das ganze ist eigentlich alles nötig um user eingaben auf einer website darzustellen. ansonsten könnte man am ende probleme bekommen...

die frage wo man das alles anwendet ist ne andere sache... es kann vorteile und nachteile haben die daten schon von vornherein so umgewandelt in der datenbank gespeicher zu haben oder erst bei der ausgabe umzuwandeln.
danke, für deine Erklärung, wenn ich das richtig verstanden habe bedeutet das: Dass das INTO nicht manipuliert werden kann. In der DB steht aber alles unmaskiert drin. Wenn ich jetzt ein Select mache muss ich das dann wieder maskieren, damit evtl Code nicht ausgeführt werden kann, oder?



DadyCool
 

Geändert von DadyCool (15.11.2006 um 13:22:55 Uhr)
DadyCool ist offline Threadstarter   Mit Zitat antworten
Alt 15.11.2006, 16:20:39   #11 (permalink)
unregiert
abgemeldet

Reg: 22.04.2006
Beiträge: 453
Standard

Du maskierst Sachen (\', HTML, <br>), du schickst die maskiert in die DB. Beim Auslesen musst du meines Wissens her blos die Back-Slashes (\) entfernen (mit stripslashes).
 
unregiert ist offline   Mit Zitat antworten
Alt 15.11.2006, 16:22:48   #12 (permalink)
ice-breaker
return void
Benutzerbild von ice-breaker

ID: 93995
Lose senden

ice-breaker eine Nachricht über ICQ schicken
Reg: 27.04.2006
Beiträge: 6.271
Standard

also, schau mal in den Snippets-Bereich hier im Programmierforum, ich habe dort einen kleinen Code gepostet, der dich komplett vor mysql-injections schützt und dabei musst dur dir keine gedanken machen, zudem werden deine querys ordentlich formatiert
"Die Wahrheit entgeht dem, der nicht mit beiden Augen sieht." -Orici

www.internet-dsl-flatrate.de
ice-breaker ist offline   Mit Zitat antworten
Alt 23.11.2006, 15:39:01   #13 (permalink)
marcaust
Erfahrener Benutzer

ID: 166
Lose senden

Reg: 20.04.2006
Beiträge: 279
Standard

Du meinst mit Sicherheit die hier:
http://www.klamm.de/forum/showpost.p...39&postcount=7

;-)

Dazu mal ein paar Fragen:
Du schreibst die Query soll so aufgerufen werden:
db_query('SELECT * FROM %s WHERE `%s`=%d','user','klammid',93995);

um die jetzt in einem vorhandenem Script einsetzen zu können müste jede Query umgearbeitet werden. Bei den meisten Scripten sieht es ja etwa so aus:
mysql_query('SELECT * FROM user WHERE `klammid`= $_POST['klammid']');

Wenn ich da einfach aus mysql_query ein db_query mache, würde deine Funktion das dann auch noch vor mysql-injections schützen?

Wo find ich Infos über diese %s, %d?

Grüße
Marc
 
marcaust ist offline   Mit Zitat antworten
Alt 23.11.2006, 15:48:03   #14 (permalink)
Johnson
Code-Frevler

ID: 118054
Lose senden

Reg: 20.04.2006
Beiträge: 860
Standard

Zitat:
Zitat von marcaust Beitrag anzeigen
Wo find ich Infos über diese %s, %d?
Infos findest du z.B. in der PHP-Manual (http://de.php.net/sprintf).
 
Johnson ist offline   Mit Zitat antworten
Alt 23.11.2006, 18:47:25   #15 (permalink)
ice-breaker
return void
Benutzerbild von ice-breaker

ID: 93995
Lose senden

ice-breaker eine Nachricht über ICQ schicken
Reg: 27.04.2006
Beiträge: 6.271
Standard

nein, wenn du einfach den Namen änderst gibt es keinen Schutz, wie auch.
ich würde aufjedenfall raten dann die ganzen stellen im script zu ändern, weil:
1.) es ist sicher
2.) diese schreibweise ist viel leichter zu lesen, als wenn du dauernd aus dem string rein und raus shiftest weil du variablen einfügen möchtest

btw: würde dein mysql-aufruf in dem beispiel auch noch einen parse-error generieren
"Die Wahrheit entgeht dem, der nicht mit beiden Augen sieht." -Orici

www.internet-dsl-flatrate.de
ice-breaker ist offline   Mit Zitat antworten
Antwort

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Ich zu werben-richtig.de Vodka-E Suche Werber: andere 0 04.05.2008 19:05:52
Ist das so richtig? MrLoverLover Ich bin neu hier und habe eine Frage! 11 25.03.2008 15:31:33
[PHP] maildomaincheck genau umgekehrt falsch ist richtig und richtig ist falsch speedy00 Programmierung 21 20.03.2007 14:06:22
[PHP] "richtige" escapen-Funktion Benutzer-621 Programmierung 1 22.11.2006 20:57:36
Richtig heizen NewFrontier Das wahre Leben 17 06.11.2006 09:02:03


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43:15 Uhr.